本主题介绍如何集成Android性能调谐器(也称为Tuning Fork库),以从原生(C和C++)游戏引擎记录和上传帧时间数据。
对于Unity游戏引擎,请参阅Unity指南。
背景
游戏体验的关键组成部分是渲染性能。渲染性能是以下两个输入的结果
- 帧率:绘制帧的频率。
- 图形质量设置:呈现帧的保真度级别,包括模拟保真度和图形。
对于游戏,良好的渲染性能定义如下
- 提供稳定一致的帧率(即以所需频率渲染的帧的百分比)。
- 在保持稳定的情况下,以尽可能高的频率渲染帧,通常为30或60 FPS,具体取决于游戏类型。
- 在仍然达到所需的稳定帧率的情况下,根据用户的屏幕尺寸和密度最大化用户的细节级别。
Android帧速率控制库 限制了帧时间的大部分变化,为游戏提供了稳定的帧率。帧时间的剩余变化是由于游戏玩法中某些场景期间显示的细节级别以及设备的图形功能所致。使用Android性能调谐器,您可以查明游戏玩法期间帧时间比目标慢或快的时间,并将这些问题和机会关联到
- 特定质量设置
- 游戏中的特定场景
- 特定设备型号或设备规格
记录和上传数据
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 UI中按这些参数对数据进行分段。有关更多信息,请参阅定义质量级别。
内存和CPU开销
Tuning Fork库使用的所有内存都在初始化时分配,以避免在游戏玩法期间出现意外情况。数据的大小取决于仪器密钥的数量、可能注释的数量以及每个直方图中存储桶的数量;它是所有这些乘以每个存储桶四个字节的倍数。还有所有直方图的两个副本,以允许以双缓冲方式进行提交。
提交发生在单独的线程上,并且不会阻塞滴答调用。如果没有可用的上传连接,则提交将排队以供以后上传。
调用滴答函数的处理开销很小:它只是计算直方图存储桶数组中的索引并增加整数计数。
集成Tuning Fork库
本集成指南分为两部分。第一部分介绍如何使用演示应用程序和Google Play控制台运行端到端测试。第二部分介绍如何将Tuning Fork库集成到您的工具链中以及如何使用库提供的函数。单击下面的“下一步”链接开始。