游戏卡顿白皮书 › L1 客户端游戏进程
固定时间步长追赶失控 Fixed-timestep catch-up / spiral of death
原因 ID cg-fixed-step · 主责 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
停顿一次之后集中补算积压的计算,又因为这些计算再次积压。
起因 游戏模拟按固定间隔运行,中途停顿了一次 → 结果 把积压的步长挤到一帧里集中计算 → 画面表现 长帧接连出现、不断冲高,或者撞到上限后整个世界变慢
- 症状
- 一卡一卡, 快进, 慢动作
- 因素
- 停顿
- 谁会遇到
- 只有我
- 何时出现
- 偶尔随机, 人多的时候
- 负责方
- 主责 研发团队·客户端开发
- 研发团队要做的事
- 限制每帧追赶上限,剩余时间用插值处理。
- 监控图上
- 偶发随机尖峰 · 帧耗时、每帧固定步长次数
- 查看位置
- 在开发版本的 Profiler 中同时看一帧里固定步长跑了几次(Unity 看 FixedBehaviourUpdate 等 FixedUpdate 阶段标记的个数)和帧耗时
- 确认依据
- 一个长帧之后,接连出现多个要跑多次步长的长帧;碰到上限(Unity Maximum Allowed Timestep)后,游戏时间比实际流逝得慢
- 排除依据
- 长帧只出现一次就结束,看“帧耗时尖峰”或“客户端垃圾回收”
- 确认手段
- 需要游戏服务器/客户端的日志和指标
- 深入了解
- Unity 的物理计算(FixedUpdate)是典型的固定步长(默认 0.02 秒,每秒 50 次)。Time 设置中的 Maximum Allowed Timestep(一帧内最多追赶的时间,默认约 0.33 秒)就是追赶上限。一帧比这更长时,超出的时间会被丢弃,游戏时钟也相应比实际时间慢。
出处
- Set fixed timestep to optimize physics simulation frequency Unity
Fixed Timestep 默认 0.02 秒(每秒 50 次);帧耗时长时,一帧内要跑多次物理步长,负担加重 - Handling variation in time Unity
Maximum Allowed Timestep 默认 1/3 秒(0.3333333);停住 1 秒,游戏时间也只走 0.333 秒;这个上限用来防止追赶步长再次变慢的恶性循环 - Profiler markers reference Unity
FixedBehaviourUpdate:MonoBehaviour.FixedUpdate 的执行区段,物理标记在 FixedUpdate 阶段调用
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片