鸣潮是一款由 Kuro Games 开发的高保真动作角色扮演游戏。为了持续为长时间的游戏会话提供卓越的用户体验,优化功耗非常重要。
Android Studio 从 Hedgehog (2023.1.1) 引入了功耗性能分析器,可帮助开发者根据设备端电源轨监视器 (ODPM) 了解功耗数据。
借助 Android Studio 中的功耗性能分析功能,您还可以有效地对 Android 应用功能的功耗进行 A/B 测试(如下所示)。
策略
Kuro Games 首先使用 Android Studio 功耗性能分析器来了解游戏行为如何影响设备功耗。基于这段经历,他们开发了一款基于 Perfetto 和 ODPM 的自定义工具,其中包含以下增强功能:
- 自定义视图 - 开发者可以过滤电源轨和预设灵活的时间范围。
- 更好地进行维护 - 开发者可以将功耗数据上传到其自定义的质量检查系统,并比较不同游戏版本的数据。
处理 ODPM 数据
如需访问 ODPM 数据,Kuro Games 使用了 Perfetto Trace Processor (Python) Metric API 将 android_powerrails
指标(在 Perfetto 指标 proto 中定义为 AndroidPowerRails
)中的 30 秒时段的 avg_used_power_mw data
处理为以下格式:
电源轨 | 画质 | FPS | 亮度 | 平均功耗 | 百分比(每个轨道 / 总计) |
---|---|---|---|---|---|
power.rail.cpu.big | 高 | 30 | 低 | 474.158 毫瓦 | 14.70% |
power.rail.cpu.mid | 高 | 30 | 低 | 470.916 毫瓦 | 14.60% |
power.rail.cpu.little | 高 | 30 | 低 | 438.662 毫瓦 | 13.60% |
power.rail.gpu | 高 | 30 | 低 | 346.761 毫瓦 | 10.70% |
… | … | … | … | … | … |
找出功耗高的电源轨
每个电源轨都没有标准值。为了确定功耗较高的电源轨,Kuro Games 使用了不同的测试用例(包括空闲、运行和战斗)创建了 A/B 测试。您可以通过比较同一电源轨的值来确定值明显偏高的特定电源轨。通过比较各种测试用例的行为差异,我们可以逐步找出功耗问题的根本原因。
优化
借助 ODPM 数据,Kuro Games 可以衡量每种优化场景的改进效果:
- 更改 CPU 核心调度策略并调整不同线程的优先级,以减少大核心的工作负载
- 预编译 PSO(流水线状态对象),以减少 CPU 的运行时着色器编译工作负载
- 实现 PVS(可能可见的集合)剔除以减少 GPU 渲染工作负载
- 离线烘焙阴影遮挡剔除,以减少 GPU 渲染工作负载
为了比较相同且可重现的条件下的测试结果,Kuro Games 使用相同的 3D 场景和相机视角在测试用例中检索了 ODPM 数据,且时长相同。
结果
通过利用 ODPM 和功耗性能分析数据,Kuro Games 将总功耗从 9 月版本(版本 0904)的 3233 毫瓦降低到了 11 月版本(版本 1.4 最终版)的 2920 毫瓦,降低了 9.68%。下图详细介绍了在 FPS 和图形设置保持不变的情况下,这种功耗降低情况。
ODPM 数据目前仅适用于 Pixel 6 及更新型号的设备,但您可以通过 CPU 使用率、GPU 使用率和 Batterystats 等其他指标,在所有 Android 设备上看到改进。例如,Kuro Games 还发现,在 Oppo Reno 5 上,相同场景的 GPU 使用率总体降低了 9.6%。
开始使用
对于高级用例,您可以从功耗性能分析器或 Perfetto 功耗轨数据着手。
ODPM 电源轨名称因设备而异。电源轨名称可能类似于“S2S_VDD_G3D”;需要具备特定的设备硬件知识才能解读相应的功耗监控器数据。从 Android API 级别 35 开始,您可以使用 getSupportedPowerMonitors
中的 PowerMonitor
。借助 PowerMonitor,您可以检索可读取的标签与各个原始设备制造商 (OEM) 设置的原始电源轨名称之间的映射。
如需验证未启用 ODPM 的设备上的改进,您可以使用 CPU 时钟、GPU 时钟和内存带宽估算值作为功耗的代理。