← 全部概念
游戏系统 / 24
固定时间步
让物理模拟按稳定节拍运行
交互演示
交互演示 · 移动指针或点击画面,观察变化
固定时间步将物理模拟按恒定时长推进,这里是 1/60 秒,不受渲染帧率影响。每一帧都将自身耗时加入累加器,运行尽可能多的完整时间步,再把剩余时间留到下一帧。上方的弹簧则直接用实际帧间隔推进,因此只要短暂出现连续几帧 92 ms 的情况,就会不断增加能量,最终模拟失稳。
适用场景
使用固定时间步,进行可重复的物理更新,并保持数值积分稳定。渲染插值能够平滑物理步之间的运动,同时不改变模拟更新频率。
实现示例
不依赖特定引擎的伪代码。请根据你使用的引擎调整函数和坐标约定。
accumulator += min(frameSeconds, 0.25)
while accumulator >= step:
previous = current
current = simulate(current, step)
accumulator -= step
render(lerp(previous, current, accumulator / step))常见错误
如果模拟一次更新所需的真实时间,比它推进的模拟时间还长,待处理的积压就可能无限增长。应设置追帧预算,并明确过载时的处理策略。仅有固定时间步,并不能保证不同机器上的模拟结果完全一致。
延伸阅读
Gaffer On Games:修正你的时间步(Fix Your Timestep)↗内容原作 Nicolas Zullo · 中文整理与交互改编