本主题介绍了如何集成 Android Performance Tuner(也称为 Tuning Fork 库),以记录和上传原生 (C 和 C++) 游戏引擎的帧时间数据。
对于 Unity 游戏引擎,请参阅适用于 Unity 的指南。
背景
游戏体验的一个关键组成部分是渲染性能。渲染性能是以下两个输入的产物
- 帧速率:帧绘制的频率。
- 图形质量设置:帧呈现的保真度级别,包括模拟保真度和图形。
对于游戏而言,良好的渲染性能定义如下
- 提供稳定一致的帧速率(即,以所需频率渲染的帧百分比)。
- 在保持稳定性的前提下,以尽可能高的频率渲染帧,通常为 30 或 60 FPS,具体取决于游戏类型。
- 在用户屏幕尺寸和密度既定的情况下,最大程度地提高细节水平,同时仍能实现所需的稳定帧速率。
Android 帧速调节库限制了帧时间的大部分变化,为游戏提供了稳定的帧速率。帧时间的剩余变化是由于游戏过程中某些场景中显示的细节级别以及设备的图形功能所致。使用 Android Performance Tuner,您可以查明游戏过程中帧时间比目标值慢或快的时间点,并将这些问题和机会关联到
- 特定质量设置
- 游戏中的特定场景
- 特定设备型号或设备规格
记录并上传数据
Tuning Fork 库依赖于其一个滴答函数由 Android 帧速调节库每帧调用。在该库中,此滴答信息会聚合到直方图中,然后通过 HTTP 端点定期上传到 Google Play。每个滴答都记录为与插桩键和注解关联,它们的定义在协议缓冲区文件中指定。
插桩键
插桩键指示滴答在帧中的来源,并且是一个必须传递给每个滴答函数调用的整数。Android 帧速调节库使用一组预定义的插桩键,这些键在 swappy_common.h
中定义。如果您不使用帧速调节库,也可以定义自己的插桩键。
注解
注解提供有关游戏记录滴答时正在执行的操作的上下文信息。例如,注解可以识别以下任一内容
- 当前游戏关卡
- 屏幕上出现“大 Boss”
- 任何其他相关的游戏状态信息
注解由 com.google.tuningfork.Annotation
协议缓冲区消息定义。要设置当前注解,您需要将所定义消息的序列化内容传递给 TuningFork_setCurrentAnnotation()
。然后,所有后续的滴答数据都将与此注解关联,直到设置另一个注解。以下是注解的 proto 定义示例
import "tuningfork.proto"
enum Level {
INVALID_LEVEL = 0;
Level_1 = 1;
Level_2 = 2;
Level_3 = 3;
}
message Annotation {
optional Level level = 1;
}
保真度参数
保真度参数会影响游戏的性能和图形保真度,例如网格细节级别、纹理分辨率和抗锯齿方法。与注解类似,保真度参数使用 com.google.tuningfork.FidelityParams
协议缓冲区消息定义。以下是保真度参数的 proto 定义示例
import "tuningfork.proto"
message FidelityParams {
int32 texture_quality_level = 1;
int32 shadow_resolution = 2;
float terrain_details_percent = 3;
int32 post_processing_effects_level = 4;
}
在 Tuning Fork 初始化时,您会传递游戏所用参数的序列化内容。例如,如果用户更改游戏渲染设置,您可以更改这些参数,您后续上传的数据将与新参数关联。
为了让 Google Play 理解您定义的注解和保真度参数,包含这些定义的协议缓冲区文件必须与初始化设置一起打包在游戏的 APK 中。您还需要在 APK 中为常见的保真度参数组合提供默认值,以便在 Google Play 界面中按这些参数对数据进行分段。如需了解详情,请参阅定义质量等级。
内存和 CPU 开销
Tuning Fork 库使用的所有内存都在初始化时分配,以避免游戏过程中出现意外。数据大小取决于插桩键的数量、可能的注解数量以及每个直方图中的存储桶数量;它是所有这些项乘以每个存储桶的四字节的倍数。所有直方图也有两份副本,以允许双缓冲方式提交。
提交在单独的线程上进行,不会阻塞滴答调用。如果没有可用的上传连接,提交将排队等待稍后上传。
调用滴答函数(tick function)的处理开销很小:它只是计算直方图存储桶数组中的索引并递增整数计数。
集成 Tuning Fork 库
本集成指南分为两部分。第一部分介绍如何使用演示应用和 Google Play 管理中心运行端到端测试。第二部分介绍如何将 Tuning Fork 库集成到您的工具链中以及如何使用该库提供的功能。点击下面的下一步链接开始。