移动端 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_TimeExc | GameThread 排除等待后的实际执行耗时 |
| RT_Exc | RenderThread 执行耗时 |
| RHI_Exc | RHIThread 执行耗时 |
| FrameSyncTime | 等待同步造成的帧时间成本 |
| GT_Idle / RT_Idle / RHI_Idle | 判断是不是线程空等或被其他线程卡住 |
第三层是场景上下文:
- 当前坐标、相机方向、地图区域;
- DrawCall、PrimitivesDrawn;
- 是否触发载具、AI、特效、UI、加载;
- 是否同一画质、同一帧率档、同一设备温度条件;
- 是否存在录屏、日志、调试开关影响。
3. 一个更靠谱的 PGO 测试流程
PGO 对比最怕“场景不一致”。我更推荐固定一条可复现路线:
- 清后台,重启设备或至少冷却到稳定温度;
- 固定画质、帧率、亮度、电量区间;
- 固定地图路线、移动速度、镜头方向;
- 分别跑非 PGO 与 PGO 版本;
- 采集 FPS、CPU、GPU、内存、SS2/CSV 帧时间;
- 对齐同一路线区间,去除加载、结算、异常暂停等非稳态帧;
- 输出平均值、P95/P99、1% Low、线程耗时均值与高分位;
- 对瓶颈类型进行分布统计。
如果只是拿两段随机跑图数据比较,很容易得到错误结论。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% Low 提升;
- 是否降低 GT/RT/RHI 任一热点线程耗时;
- 是否降低 CPU 均值或峰值;
- 是否不增加内存、包体、启动时间风险;
- 是否在多场景、多设备上没有回退。
平均 FPS 是门面,1% Low 和 FrameTime 才是底子。PGO 的价值,很多时候就是让底子变稳。