移动端 PGO 优化怎么评估:平均 FPS 没变,为什么 1% Low 更关键?

移动端 PGO 优化怎么评估:平均 FPS 没变,1% Low 为什么能说明问题

摘要:PGO 的效果经常不是“平均 FPS 暴涨”,而是让主线程、渲染线程和 RHI 线程更稳。本文用一次脱敏的移动端高帧场景对比,说明如何从 FPS、1% Low、FrameTime、GT/RT/RHI 耗时和 CPU 占用判断 PGO 是否真的生效。

  • 推荐分类:Android / 开发工具
  • 推荐标签:PGO、性能测试、1%Low、FrameTime、HarmonyOS、移动端游戏
  • 封面短标题:PGO 性能评估

1. 为什么 PGO 不能只看平均 FPS

PGO,全称 Profile Guided Optimization,本质是让编译器基于真实运行画像重新优化代码布局、分支预测、内联策略和热点路径。它对移动端游戏的收益,经常体现在“帧时间更稳”而不是“平均帧率突然变高”。

如果一个 120 帧场景本来就能跑到 119.x FPS,那么平均 FPS 的提升空间非常有限。这个时候更应该看:

  • 1% Low 是否抬升;
  • 最低帧是否变好;
  • FrameTime 标准差是否下降;
  • CPU 均值是否下降;
  • GameThread、RenderThread、RHIThread 的执行耗时是否下降;
  • 是否减少 GameGap / RHIThread / GameThread 类型瓶颈帧。

一次脱敏测试里,PGO 版本与非 PGO 版本的平均 FPS 只差约 0.2 FPS,看起来几乎没变化。但 1% Low 从约 85 FPS 提升到约 96 FPS,最低帧从 113 提升到 117,CPU 均值下降约 3.8 个百分点。这种结果比“平均 FPS +0.2”更有意义,因为它说明 PGO 改善的是卡顿尾部。

2. 推荐的 PGO 对比指标

PGO 评估建议分三层看。

第一层是体验指标:

指标作用
平均 FPS判断整体性能上限,但高帧场景容易被帧率上限钳住
最低帧观察最极端瞬时波动,但容易被偶发事件影响
1% Low衡量尾部稳定性,比平均 FPS 更适合看微卡顿
Jank / 10min适合长时间跑图或战斗场景
标准差衡量帧率波动程度

第二层是线程耗时:

指标解释
FrameTime单帧总耗时
GT_TimeExcGameThread 排除等待后的实际执行耗时
RT_ExcRenderThread 执行耗时
RHI_ExcRHIThread 执行耗时
FrameSyncTime等待同步造成的帧时间成本
GT_Idle / RT_Idle / RHI_Idle判断是不是线程空等或被其他线程卡住

第三层是场景上下文:

  • 当前坐标、相机方向、地图区域;
  • DrawCall、PrimitivesDrawn;
  • 是否触发载具、AI、特效、UI、加载;
  • 是否同一画质、同一帧率档、同一设备温度条件;
  • 是否存在录屏、日志、调试开关影响。

3. 一个更靠谱的 PGO 测试流程

PGO 对比最怕“场景不一致”。我更推荐固定一条可复现路线:

  1. 清后台,重启设备或至少冷却到稳定温度;
  2. 固定画质、帧率、亮度、电量区间;
  3. 固定地图路线、移动速度、镜头方向;
  4. 分别跑非 PGO 与 PGO 版本;
  5. 采集 FPS、CPU、GPU、内存、SS2/CSV 帧时间;
  6. 对齐同一路线区间,去除加载、结算、异常暂停等非稳态帧;
  7. 输出平均值、P95/P99、1% Low、线程耗时均值与高分位;
  8. 对瓶颈类型进行分布统计。

如果只是拿两段随机跑图数据比较,很容易得到错误结论。PGO 本身优化的是热点路径,场景路径不一致时,收益会被资源加载、视野差异、网络波动、温控等因素淹没。

4. 怎么解释“平均 FPS 只高 0.2,但 1% Low 高 11”

这类结果可以这样写结论:

在高帧率上限场景中,平均 FPS 已接近帧率上限,PGO 对平均 FPS 的提升不明显;但从 1% Low、最低帧和 CPU 均值看,PGO 对帧时间尾部有改善,说明热点路径执行效率和线程稳定性有所提升。

不要写成“PGO 无明显收益”。因为平均 FPS 被上限钳住时,它本来就不是敏感指标。

如果线程耗时也同步下降,比如:

  • GT_TimeExc 下降;
  • RT_Exc 下降;
  • RHI_Exc 下降;
  • FrameTime 小幅下降;

那结论就更稳:PGO 的收益不是采样误差,而是主线程/渲染线程/RHI 链路都有改善。

5. 注意:PGO 不是万能优化

PGO 对 CPU 热点更敏感,对纯 GPU 瓶颈不一定有效。如果场景瓶颈来自:

  • 大面积半透明过绘;
  • 高复杂度材质;
  • 过高三角面;
  • 纹理带宽压力;
  • 后处理成本;
  • GPU 频率被温控压低;

PGO 的收益可能很有限。

所以 PGO 结论里要区分:

  • CPU/线程侧收益;
  • GPU/渲染侧收益;
  • 帧时间稳定性收益;
  • 用户体感收益。

6. 推荐的报告模板

可以把 PGO 测试报告写成下面这个结构:

1. 测试对象 - PGO 版本 - 非 PGO 版本 - 设备、画质、帧率、场景 2. 体验指标 - 平均 FPS - 最低帧 - 1% Low - Jank - 标准差 3. 线程指标 - FrameTime - GT_TimeExc - RT_Exc - RHI_Exc 4. 结论 - 平均 FPS 是否接近上限 - 尾部帧是否改善 - CPU 是否下降 - 是否建议接入 5. 风险 - 是否只覆盖单场景 - 是否需要战斗、UI、载具、加载等更多场景回归

7. 我的判断口径

如果我来判断一个移动端 PGO 是否值得合入,会按这个优先级:

  1. 是否有稳定的 1% Low 提升;
  2. 是否降低 GT/RT/RHI 任一热点线程耗时;
  3. 是否降低 CPU 均值或峰值;
  4. 是否不增加内存、包体、启动时间风险;
  5. 是否在多场景、多设备上没有回退。

平均 FPS 是门面,1% Low 和 FrameTime 才是底子。PGO 的价值,很多时候就是让底子变稳。