客户端预测与纠正重放
Client-Side Prediction & Reconciliation
本地客户端立刻用与服务器相同的运动(及可选武器)代码根据输入推进自己的角色,消除操作往返延迟;服务器仍是权威。权威纠正到达时已是「过去」,客户端丢弃过期缓冲、回绕到纠正状态再重放未确认输入,得到与服务器一致的「现在」。
问题
纯 C/S 下,按前进要等 RTT 才看到自己动——原版 Quake 的手感。QuakeWorld 引入客户端预测:客户端知道碰撞、摩擦、重力等,先本地猜结果。(What Every Programmer Needs To Know About Game Networking)
为何客户端不能当权威
若客户端直接上报「我的当前位置」,作弊者可瞬移、穿弹。故服务器必须权威;预测只是本地乐观执行。(What Every Programmer Needs To Know About Game Networking;Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)
算法(Half-Life / 通用)
- 采样输入,生成 usercmd,发给服务器,并本地存档(含时间戳)。
- 以服务器最后确认的玩家状态为
from,按序对所有未确认命令跑与服务器共享的移动代码(HL 的pm_shared/),得到预测位姿并渲染。 - 服务器快照确认某条命令后,比较预测与权威;误差超阈值则纠正。
- 纠正针对的是过去时刻:在环形缓冲里找到对应 Move,重置为服务器状态,重放之后所有输入到当前预测时间;世界其余部分可先固定。(Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization;What Every Programmer Needs To Know About Game Networking;Networked Physics (2004))
sequenceDiagram participant C as 本地客户端 participant S as 权威服务器 C->>C: 存 cmd t0..t4 并预测到 t4 C->>S: 发送 cmd S->>C: 确认到 t1 的权威状态 C->>C: 丢弃 ≤t1 的缓冲 C->>C: 从权威 t1 重放 t2..t4
上图:纠正落在过去,靠重放对齐到本地的「现在」。
实现陷阱
- 特效与声音:命令会被反复重跑,脚步声等只能在「该命令第一次预测」时播;服务器也不应再复制已在本地预测的效果。(Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)
- 纯客户端字段(如蹲下过程中的眼睛高度):需要滑动窗口保存中间状态,ack 后把客户端专有字段拷到新的起点。
- 平滑:重放后的硬纠正可用指数平滑减弱抽动(Gaffer 对远程与本地纠正都用过类似手法)。(Networked Physics (2004);Source 的
cl_smooth/cl_smoothtime) - 预测范围:只能预测本地玩家及「只被其影响」的实体;其他人的输入不可知,远程实体走 快照插值。(Source Multiplayer Networking)
武器预测
把开火逻辑也放进共享代码,弹药、冷却、动画状态作为权威复制字段,则切枪/开火也可本地即时反馈。命中结果仍以服务器为准;没有 延迟补偿 时,高延迟玩家仍需提前量瞄准。(Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)
与 UE5
角色移动组件与 Mover 的 ServerMove / ClientAdjustPosition / 保存移动重放,以及 GAS 预测,都是本模式的引擎实现。Iris/复制层提供权威状态通道,见 网络复制与 RPC。