确定性锁步同步
Deterministic Lockstep
锁步不同步物体状态,只同步驱动模拟的输入;各方从相同初态用相同固定步长推进。带宽与对象数量无关,但要求比特级确定性,且每人延迟受最慢输入到达时间约束,通常适合约 2–4 人。
原理
发送端每模拟帧采样 Input 结构(只含影响模拟的键),附带帧号发给对端;对端没有第 n 帧输入就不能模拟第 n 帧。状态(位置、速度等)本地各自算出来,理论上校验和应逐帧一致。(Deterministic Lockstep)
确定性门槛
「差不多」不够,必须位级相同。物理引擎内部 RNG、约束处理顺序、跨编译器/OS/指令集的浮点差异、Debug/Release 优化都可能破坏确定性。固定 dt(见 游戏循环与更新方法 与 Fix Your Timestep)是必要前置条件之一。(Deterministic Lockstep;Fix Your Timestep!)
播放延迟缓冲 (Playout Delay Buffer)
网络抖动会让 60 Hz 输入挤成一团。接收端先缓冲一小段时间再匀速放出(类似视频起播缓冲)。缓冲越大越稳、延迟越高。追上积压时可限制每渲染帧最多模拟若干步,避免死亡螺旋。相关术语在专利上敏感,实现时注意。(Deterministic Lockstep)
为何不用 TCP 传输入
TCP 丢包会停等重传,锁步在等待 input n 时整段卡顿。改用 UDP:每个包冗余携带所有尚未 ack 的输入;输入很小时,即便按最坏 RTT 囤几十上百帧也只有几十到上百字节。对连续相同输入做 1-bit 游程可再压。对端回报已收到的最大输入序号,发送端丢弃更旧的副本。(Deterministic Lockstep)
这与「在 UDP 上重写 95% 的 TCP」不同:因为主动冗余小负载,从不因单包重传堵塞流水线。
取舍
| 优点 | 缺点 |
|---|---|
| 带宽与物体数无关 | 全场确定性工程成本极高 |
| 实现正确时无状态不同步 | 延迟 ≈ 最慢玩家 + 缓冲 |
| 人数一多,等齐输入代价陡增 | |
| 中途加入困难 |
对象很多、人数较多或无法保证确定性时,改用 快照插值。