渲染性能指标:FPS、丢帧率、帧耗时、GPU负载

聊锁屏渲染优化,第一步就是搞清楚——你到底该看哪些数据?
我见过不少团队,一上来就盯着FPS猛怼,结果优化了半天还是卡。其实,单一指标会骗人。
今天我把四个最核心的指标掰开揉碎讲清楚。你搞懂了这些,后面的埋点策略才有根。

FPS —— 帧率,但别只看数字

FPS,帧每秒。60代表流畅,30算及格。这个大家太熟了。
但我想说,FPS是个“平均”指标,它藏着很多猫腻。
举个例子:你跑了一分钟,前30帧全是16ms,后30帧忽然跳成100ms。平均值算出来还是差不多60FPS。可用户感受到的?卡成PPT。

所以我的习惯是:永远配合帧耗时一起看。
嗯,后面会细讲。

个人经验
我之前在优化锁屏动效时,FPS一直维持在58~60,但用户反馈“滑动不跟手”。后来发现,是因为偶尔一帧耗时飙到了200ms,虽然只丢了一帧,但视觉上的卡顿非常明显。从那以后,我再也不只看FPS了。

丢帧率 —— 真正反映“卡顿”的硬指标

丢帧率,也叫“掉帧率”。它统计的是:你本应渲染60帧,实际只渲染了50帧,那丢掉的10帧占多大比例?
计算方式很简单:

丢帧率 = (预期帧数 - 实际渲染帧数) / 预期帧数 × 100%

举个例子:1秒内预期60帧,实际只完成55帧,丢帧率就是约8.3%。

这个指标比FPS敏感得多。因为哪怕掉了一帧,丢帧率也会立刻跳出来。你想想看,FPS下降一点你可能觉得“还行”,但丢帧率超过5%就是明显卡顿了。

避坑提醒
我曾经踩过一个坑:丢帧率统计时,误把渲染线程的帧数算进去了。实际上,丢帧率应该基于显示帧——即真正提交到屏幕上的帧。渲染线程提前完成了,但如果合成线程卡住,依然会丢帧。这个细节很多人忽略。

帧耗时 —— 精确到毫秒的“慢动作监控”

帧耗时,也叫帧时间。单位是ms。每帧从开始到完成的时间。
16.67ms对应60FPS,33.33ms对应30FPS。

但重点不是平均值,而是最大值和P99分位值。
为什么?因为平均帧耗时低,不代表每帧都稳定。可能大部分帧都是10ms,突然一帧变成50ms,这就是卡顿的根源。

我通常会在埋点里记录三组数据:

  • 平均帧耗时 —— 整体趋势
  • 最大帧耗时 —— 最差情况
  • P99帧耗时 —— 99%的帧都小于这个值

如果P99帧耗时超过30ms,那100帧里就有1帧是卡顿的。这种频率用户完全可以感知。

一句话口诀
FPS看活着,丢帧率看卡顿,帧耗时看有多卡。

GPU负载 —— 渲染瓶颈的“照妖镜”

GPU负载不是直接的用户体验指标,但它是分析卡顿原因的利器。
如果你的FPS上不去,帧耗时又高,那么看看GPU利用率。如果GPU一直100%,说明瓶颈在渲染侧;如果GPU才30%,那问题大概率在CPU或合成线程。

常见的GPU指标包括:

  • GPU利用率 —— 单位时间GPU被占用的比例
  • GPU频率 —— 降频意味着发热降性能
  • 渲染命令数 —— draw call过多会导致GPU负载飙升

我在优化锁屏渲染时,就遇到过GPU负载忽高忽低的情况。后来发现是因为锁屏界面的模糊效果每次都要重新渲染整张图。改了缓存策略后,GPU负载瞬间从80%降到20%。

注意
GPU负载不能跨设备直接对比。A芯片的60%负载和B芯片的60%性能完全不同。最好在同设备、同场景下比较相对变化。

四个指标的关系——一张图看懂

下面这张图总结了你需要掌握的核心关系:

渲染性能指标关系图 锁屏渲染性能 FPS(帧率) 丢帧率 帧耗时 GPU负载 平均FPS 最低FPS 连续丢帧数 丢帧峰值区间 平均耗时 P99耗时 利用率 降频 💡 核心思路: FPS是“面”,丢帧率是“点”,帧耗时是“线”,GPU负载是“根”。 优化时先看丢帧率定位卡顿,再用帧耗时确认卡顿程度, 最后用GPU负载判断瓶颈是否在渲染侧。

一张表格搞定指标对比

指标名称 单位 反映问题 使用场景 注意点
FPS 帧/秒 整体流畅度 宏观性能评估 平均可能掩盖卡顿
丢帧率 百分比 卡顿频率 判断是否需要优化 要基于显示帧统计
帧耗时 ms 卡顿严重程度 精确定位慢帧 重点看P99分位值
GPU负载 百分比 渲染瓶颈 定位卡顿原因 需结合CPU一起看

说完这四个指标,你应该能建立起一个清晰的监控思路了。
我个人的做法是:先定一个丢帧率阈值(比如5%),超过就触发详细分析。然后抓取帧耗时和GPU负载,定位具体卡顿帧。这样一步步走,基本不会漏掉问题。
你不妨也试试这个流程——从丢帧率入手,往下深挖。