平均 FPS
流畅稳定的帧速率对于在 Android 设备上提供优质的游戏体验至关重要。在衡量游戏性能时,您应将平均 FPS 作为基准进行衡量,以便对体验有基本的了解。您应优化游戏,使其达到 60 FPS 的平均帧速率,以确保提供出色的游戏体验。
P90 和 P99 FPS(用于衡量稳定性)
即使游戏的平均帧速率达到流畅的 60 FPS,仍可能会出现间歇性卡顿、微卡顿和不可预测的输入延迟,从而导致玩家体验不佳。
因此,帧稳定性与跟踪平均帧速率同样重要。您应在此处分别将 P90 和 P99 帧速率指标作为一致的基准和卡顿指示器进行衡量。这些指标可捕获性能的“尾端”,以便您优化玩家体验的流畅度。
指标
- 平均 FPS(基准):此基本指标可提供游戏性能的一般基准。虽然这是标准基准,但平均计算意味着无法检测到间歇性掉帧和微卡顿,因此仅凭此指标无法充分反映播放器体验。
- P90 FPS(稳定基准,位于第 10 个百分位):这表示有 90% 的帧超过了此稳定基准,只有最慢的 10% 的帧需要更长时间才能呈现。如果 P90 帧速率较高且接近平均帧速率,则表示游戏在会话的大部分时间里运行得非常稳定。
- P99 FPS(第 1 百分位处的卡顿指标):此指标表示 99% 的帧超过了此卡顿指标,专门用于隔离最慢的 1% 的帧。此指标对于捕获微卡顿、资源加载延迟以及导致明显卡顿的突发资源密集型渲染峰值至关重要。
示例
通过将平均 FPS 与 P90 和 P99 指标进行比较,您可以准确诊断游戏的潜在行为。
场景 1:最佳曲线(优化后的游戏)
- 平均:60 FPS (16.6 毫秒)
- P90:58 FPS(17.2 毫秒)
- P99:52 FPS(19.2 毫秒)
- 分析:指标紧密聚类。游戏体验非常流畅且稳定。没有微卡顿,即使是最差的 1% 帧,人眼也几乎察觉不到。
方案 2:负载瓶颈(CPU/GPU 受限)
- 平均:45 FPS(22.2 毫秒)
- P90:40 FPS(25.0 毫秒)
- P99:38 FPS(26.3 毫秒)
- 分析:平均帧速率较低,但始终如此。与平均帧速率相比,P99 并未大幅下降。这表示系统基本上已因图形设置或分辨率限制而不堪重负。游戏不会出现卡顿,但会感觉运行缓慢。降低图形设置通常会使这些指标统一增加。
场景 3:不稳定的 60 FPS(着色器编译 / 资源流式传输卡顿)
- 平均:60 FPS (16.6 毫秒)
- P90:45 FPS(22.2 毫秒)
- P99:15 FPS(66.6 毫秒)
- 分析:这是最糟糕的情况。虽然平均帧速率看起来非常出色,但 P99 却揭示了一个严重问题。66.6 毫秒的 P99 表示游戏一次完全冻结多个帧。这表示存在严重离群值,通常是由 CPU 瓶颈、资源流式传输延迟(例如,RAM 或存储空间速度缓慢)或由着色器编译引起的卡顿所致。
衡量
如需有效衡量平均 FPS、P90 和 P99,您可以使用 Android dumpsys surfaceflinger timestats 命令。此工具可提供正在渲染的所有图层的平均 FPS 和 presentToPresent 时间直方图。帧的 presentToPresent 时间是指当前帧与正在绘制的前一帧之间的时间间隔。
以下是有关如何为游戏收集和计算这些指标的分步说明:
开始捕获:运行以下命令,并使用 enable 和 clear 标志来开始捕获信息:
adb shell dumpsys SurfaceFlinger --timestats -clear -enable转储信息:当游戏运行足够长时间后,再次运行带有转储标志的命令以输出信息:
adb shell dumpsys SurfaceFlinger --timestats -dump按层过滤:转储的信息会提供 SurfaceFlinger 渲染的所有层的数据。您必须通过基于
layerName进行过滤来找到与您的游戏对应的部分(例如,layerName = SurfaceView[com.example.yourgame...])。layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833确定平均 FPS:系统会自动计算每个图层的平均 FPS,并直接在 dump 输出中显示(例如,averageFPS = 30.179)。
... averageFPS = 30.179 ...计算 P90 和 P99 帧速率:如需查找 P90 和 P99 指标,您需要分析 dump 中提供的 totalFrames 和
presentToPresent时间直方图。totalFrames = 1000 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0A. 概念示例(累积分布表)假设您的游戏会话记录的总帧数为 1,000。若要找到 P90 和 P99,您需要计算累积帧数分别达到 900 帧(90%)和 990 帧(99%)时的毫秒阈值,从最低的毫秒桶开始向上计数。
帧时间(毫秒) 帧数(直方图) 累计帧数 百分位状态 / 计算 16 毫秒 850 850 85.0% 33 毫秒 100 950 95.0%
(P90 目标值 900 已达成!→ 1000/33 = 30.3 FPS)50 毫秒 35 985 98.5% 66 毫秒 10 995 99.5%
(P99 目标值 990 已达到!→ 1000/66 = 15.1 FPS)102 毫秒 5 1000 100% B. 实现逻辑(伪代码)如果您使用 Python 脚本或日志解析器自动执行此分析,则可以按如下方式实现从直方图中提取 P90 和 P99 值的逻辑:
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are found停止捕获:收集所有必要信息后,您应使用停用标志来停用 timestats:
adb shell dumpsys SurfaceFlinger --timestats -disable
慢会话
缓慢会话用于识别普遍存在的实际性能问题。如果超过 25% 的帧低于某个阈值(例如 20 FPS),则会话为“慢”会话。虽然此指标有助于发现严重 build 问题,但仅靠此指标无法保证提供高品质、可持续的体验。游戏可能避开了慢会话阈值,但仍会受到微卡顿的影响,从而无法提供流畅的 60 FPS 体验。
虽然“缓慢会话”和“帧速率”都派生自帧时间,但它们发挥着不同的作用。平均 FPS、P90 FPS 和 P99 FPS 指标用于衡量性能的质量和可持续性,可检测到“慢会话”指标可能忽略的瞬时下降和不一致的步调。
总结
要想成功优化效果,需要制定全面的策略。开发者应将“缓慢会话”作为主要雷达来发现严重的性能下降,然后检查平均 FPS、P90 和 P99,以诊断根本原因并验证游戏的实际流畅度。通过集成这些指标,您可以确保应用提供持续稳定且出色的用户体验。
其他资源
如需详细了解高级分析技术、如何实现 Frame Pacing API 以及特定于引擎的优化策略,请查看 Android 开发者官方文档:
- Android Vitals:慢会话:了解 Google Play 如何衡量和报告持续时间较长的呈现速度缓慢,这会直接影响用户体验。“慢会话”是指用户会话中速率较慢的帧(例如,超过 50 毫秒,相当于 20 FPS)占比超过 25% 的会话。
- Android 开发者:优化游戏性能:探索 Android 游戏优化中心。本指南内容全面,涵盖了各种最佳实践和分析工具(例如 AGI 和 Perfetto),可帮助您最大限度地提升游戏的整体性能。