Android Performance Tuner 概览(原生)

本主题介绍如何集成 Android Performance Tuner(也称为 Tuning Fork 库)以记录和上传原生(C 和 C++)游戏引擎中的帧时间数据。

如需了解 Unity 游戏引擎信息,请参阅 Unity 指南

背景

游戏体验的关键组成部分是渲染性能。渲染性能是以下两项输入的结果:

  • 帧速率:绘制帧的频率。
  • 图形画质设置:呈现帧所用的保真度,包括模拟保真度和图形。

对于游戏,良好的渲染性能定义如下:

  • 提供稳定一致的帧速率(即,以需要的频率渲染的帧的百分比)。
  • 以尽可能高的频率渲染帧,同时保持稳定性,通常为 30 或 60 FPS,具体取决于游戏类型。
  • 根据用户屏幕尺寸和密度,为用户呈现最大程度的细节,同时仍保持所需的稳定帧速率。

Android Frame Pacing 库会限制帧时间中的大多数变化,为游戏提供稳定的帧速率。在帧时间中,其余变化是由游戏过程中某些场景显示的细节程度以及设备的图形功能决定的。使用 Android Performance Tuner 可以找出游戏过程中帧时间与目标值相比慢或快的用时,并将这些问题和优化建议关联到以下方面:

  • 具体画质设置
  • 游戏中的特定场景
  • 特定设备型号或设备规格

记录和上传数据

Tuning Fork 库依赖于由 Android Frame Pacing 库为每帧调用的其中一个 tick 函数。在库中,此 tick 信息汇总成直方图,然后通过 HTTP 端点定期上传至 Google Play。每个 tick 都被记录为与一个插桩键和一个注释相关联,其定义由您在协议缓冲区文件中指定。

插桩键

插桩键指示 tick 来自帧中的位置,并且是必须传递给每个 tick 函数调用的整数。Android Frame Pacing 库使用 swappy_common.h 中定义的一组预定义插桩键。如果您不使用 Frame Pacing 库,您还可以定义自己的插桩键。

注释

注释可以提供有关记录 tick 时游戏在进行何种操作的背景信息。例如,注释可以识别以下任何信息:

  • 当前游戏关卡
  • 正在加载特定场景
  • 屏幕上出现“大 Boss”
  • 任何其他相关的游戏状态信息

注释由 com.google.tuningfork.Annotation 协议缓冲区消息定义。如需设置当前注释,请将您定义的一组序列化消息传递给 TuningFork_setCurrentAnnotation()。所有后续 tick 数据都将与此注释相关联,直到设置另一个注释。以下是注释的 proto 定义示例:

import "tuningfork.proto"
enum LoadingState {
  INVALID_LS = 0;
  LOADING = 1;
  NOT_LOADING = 2;
}
enum Level {
  INVALID_LEVEL = 0;
  Level_1 = 1;
  Level_2 = 2;
  Level_3 = 3;
}
message Annotation {
  optional LoadingState loading_state = 1;
  optional Level level = 2;
}

保真度参数

保真度参数会影响游戏的性能和图形保真度,例如网格细节层次、纹理分辨率和抗锯齿方法。与注释一样,保真度参数使用 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 库使用的所有内存在初始化时进行分配,以避免游戏过程中出现意外。数据大小取决于插桩键的数量、可能的注释数量以及每个直方图中的存储分区数量;它的值为所有这些数值相乘后再乘以 4(每个存储分区 4 个字节)得出的字节数。此外,所有直方图还有两个副本,用于双缓冲方式的提交。

提交操作在单独的线程中执行,不会阻碍 tick 调用。如果上传连接不可用,提交操作会加入队列以供之后上传。

调用 tick 函数几乎没有处理开销:它只计算一个直方图存储分区数组的索引,并递增整数计数。

集成 Tuning Fork 库

此集成指南分为两个部分:第一部分介绍如何使用演示版应用和 Google Play 管理中心运行端到端测试。第二部分介绍如何将 Tuning Fork 库集成到工具链中,以及如何使用该库提供的函数。点击下面的下一页链接开始使用。