# 理解游戏循环里的时钟
每个渲染帧都会向游戏提供新的经过时间。在可变 delta 循环中,运动通常按 position += velocity × frameTime 更新。帧稳定时,平均速度接近目标值,但一次更新也可能和产生它的帧一样长。因此 hitch 不只是画面暂停:它会改变这次更新消耗的游戏时间。 # 比较可变积分与固定累加器
固定 timestep 循环把每个帧时长加入累加器,然后反复消耗选定的步骤,例如 16.667 ms。模拟得到大小相同的更新,而渲染器可以保持不同节奏。剩余的小数时间留在累加器中,供下一帧使用。长帧到来时,固定循环执行多个小更新来覆盖经过的时间。步骤大小保持稳定,但可能出现追赶工作峰值。 | 稳定渲染 | 一次更新使用每个正常帧时长 | 相同步骤消耗累积时间 | 确认两条路径是否跟随相同运动。 |
| 长帧 | 一次大更新可能让物体移动过远 | 多个固定更新追赶经过的时间 | 同时查看位置差与追赶步骤数量。 |
| 不同渲染速度 | 更新大小随帧率变化 | 模拟步骤保持不变 | 固定步骤减少对渲染节奏的依赖。 |
| Delta 上限 | 忽略超过上限的时间 | 累加器接收完整帧时长 | 只有可以接受时间损失时才限制。 |
# 查看帧尖峰的实际影响
每秒 60 帧时,普通帧约为 16.667 ms。增加 80 ms 尖峰后,一帧约为 96.667 ms。可变模型在一次更新中消耗全部时长。固定模型则大约消耗六个 16.667 ms 步骤。总经过时间可能相同,但模拟走过的路径不同。 # 结合位置偏差和追赶步骤阅读结果
位置差等于可变路径减去固定路径。它说明两种积分策略分离了多远,但不会自动说明哪一种正确。追赶数量说明一个渲染帧中需要多少固定工作。较大的位置差意味着可见的运动差异,较多的追赶步骤则可能意味着 CPU 预算问题。两者相关,却不是同一个诊断。 # 把 Delta 限制当作策略
上限可以防止暂停的标签页、断点或严重 hitch 让角色瞬移,或让物理物体穿过几何体。代价是可变时钟会落后于实际经过的时间。如果游戏必须保留时间,应使用固定累加器或其他恢复策略。如果游戏必须限制跳跃并保持响应,上限可能合适,但丢失的时间必须是有意选择的。 # 根据需要保护的工作选择循环
| 物理、碰撞或确定性游戏玩法 | 固定 Timestep | 相同步骤让模拟更少依赖渲染节奏。 |
| 不积累状态的简单视觉运动 | 可变 Delta | 更新很小,通常不需要追赶队列。 |
| 带平滑渲染的游戏模拟 | 带插值的固定更新 | 模拟保持步骤,显示层隐藏小数进度。 |
| 严重停顿后的恢复 | 有上限的追赶策略 | 避免一次坏帧制造无限的模拟工作。 |
# 使用可重复的调节流程
先关闭尖峰,确认两条路径一致。加入可重复的 hitch,再改变频率,观察可见误差是累积还是稳定。调整固定步骤,查看追赶数量,然后再改变速度。最后启用上限,比较可变模拟时间与实际时间。这个顺序可以把偏差原因和限制偏差的策略分开。
这个实验无法证明什么
实验室使用指定的帧时长和恒定速度,因此解释的是时间行为,而不是测量设备或验证引擎。真实物理、输入采样、网络、插值和帧预算可能改变最佳设计。把结果当作假设,再在实际游戏中验证。