한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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 秒)就是追赶上限。一帧比这更长时,超出的时间会被丢弃,游戏时钟也相应比实际时间慢。

出处

  1. Set fixed timestep to optimize physics simulation frequency Unity
    Fixed Timestep 默认 0.02 秒(每秒 50 次);帧耗时长时,一帧内要跑多次物理步长,负担加重
  2. Handling variation in time Unity
    Maximum Allowed Timestep 默认 1/3 秒(0.3333333);停住 1 秒,游戏时间也只走 0.333 秒;这个上限用来防止追赶步长再次变慢的恶性循环
  3. Profiler markers reference Unity
    FixedBehaviourUpdate:MonoBehaviour.FixedUpdate 的执行区段,物理标记在 FixedUpdate 阶段调用

相关原因

同一层:L1 客户端游戏进程

其他层中同样导致“一卡一卡”的原因

查看含图示和实验的原卡片