游戏卡顿白皮书 › L1 客户端游戏进程
帧耗时尖峰 Frame hitch
原因 ID cg-hitch · 主责 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
某一帧的计算比平时多花了几倍时间,画面短暂停顿。
起因 技能特效激增、大量实体生成、UI 整体刷新挤在同一帧 → 结果 16.7 ms 内没能完成,要花 50~300 ms → 画面表现 画面顿一下,下一帧所有人一下子同时移动
- 症状
- 一卡一卡, 卡住
- 因素
- 停顿
- 谁会遇到
- 只有我
- 何时出现
- 人多的时候, 做特定操作时, 偶尔随机
- 负责方
- 主责 研发团队·客户端开发
- 研发团队要做的事
- 把繁重的工作拆到多帧执行,用 profiler 找出耗时冲高的帧,限制特效数量上限。
- 数值参考
- 60 FPS 下一帧是 16.7 ms。只要有一帧超过 50 ms,就很容易觉得“卡了一下”。
- 监控图上
- 偶发随机尖峰 · 帧耗时
- 查看位置
- 用 PresentMon 录制游戏中的帧耗时(FrameTime),以及 CPU、GPU 在该帧上花费的时间(CPUBusy、GPUBusy)。移动端看 Android vitals 的慢速会话、渲染缓慢指标
- 确认依据
- 平时在 16.7 ms 附近的帧耗时冲到 50 ms 以上的时刻,与技能演出、大量实体生成、UI 整体刷新重合,而此时 ping 不变
- 排除依据
- 帧耗时平稳、只有其他角色顿一下,是网络侧问题,看“没有插值缓冲或缓冲过短”等。冲高间隔有规律,先看“客户端垃圾回收”
- 确认手段
- 需在玩家侧环境确认
出处
- Slow rendering Android (Google)
要达到 60 FPS,每帧必须在 16 ms 内绘制完;超时就会跳帧,表现为卡顿(jank) - Slow Sessions (games only) Android (Google)
Android vitals 把超过 50 ms(20 FPS)、34 ms(30 FPS)的游戏帧视为慢帧 - PresentMon Capture Application (README-CaptureApplication.md) Intel
FrameTime(帧与帧之间的 CPU 时间)、CPUBusy/GPUBusy(生成该帧时 CPU、GPU 各自花费的时间)
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片