中EN
概念页

延迟补偿

Lag Compensation

更新于 2026-10-15 约 4 分钟延迟补偿滞后补偿命中检测SourceValveFPS

服务器在执行玩家开火等用户命令前,把其他玩家(及必要状态)回拨到「该命令在客户端生成时」所对应的世界时刻——扣除包延迟与客户端视图插值——再做命中判定,然后恢复。这样玩家可以对着自己屏幕上看到的目标直接开火,而不必凭感觉提前量;代价是可能出现「拐角后仍被击中」等时间悖论。

要解决的问题

客户端在本地时间 10.5 对准目标开火;命令在服务器 10.6 才到达,目标已走开,明明准星正确却判空。客户端预测只解决自己的移动手感,不解决「别人在你屏幕上的位置」与服务器当前位的时间差;视图还被 快照插值 故意画在过去。(Source Multiplayer Networking)

算法(Source / Bernier)

服务器保留约 1 秒的玩家位姿历史。执行 usercmd 前:

tcmd=tserver−PacketLatency−ClientViewInterpolationt_{\text{cmd}} = t_{\text{server}} - \text{PacketLatency} - \text{ClientViewInterpolation}

把其他玩家(通常仅玩家)移到 tcmdt_{\text{cmd}} 的历史位姿(可在两份历史间插值;需含蹲下、生死等),执行命令(射线检测等),再恢复。(Source Multiplayer Networking;Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)

Half-Life 把客户端插值毫秒数放进 usercmd 的 lerp_msec,服务器必须计入;关掉实体插值会导致补偿方程失真。(Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization)

sequenceDiagram
  participant Shooter as 射击者客户端
  participant S as 服务器
  participant Target as 目标(历史)
  Shooter->>Shooter: 在插值后的画面上瞄准并开火
  Shooter->>S: usercmd(含开火)
  S->>Target: 回拨到 t_cmd 位姿
  S->>S: 射线命中检测
  S->>Target: 恢复当前位置
  S->>Shooter: 确认命中 / 伤害结果

上图:命中在「射击者当时看见的世界」里结算,而非服务器当前帧的裸状态。

为何不做客户端权威命中

让客户端发「我打中了谁」更简单且可像素级,但无法信任:即使用 VAC,中间人仍可注入 hit。权威判定必须留在服务器。(Source Multiplayer Networking)

设计取舍与悖论

运维注意

不要为「更准」关掉插值或延迟补偿。sv_showimpacts / sv_showhitboxes 可用于对照客户端红盒与服务器蓝盒的时间差。旁观第一人称看到的不是带补偿的射击者视图。(Source Multiplayer Networking)

与 UE5

UE 射击游戏需在服务器命中检测中自行实现历史回放或使用引擎/插件提供的补偿;概念上与 CMC 预测、复制时间戳配合。见 网络复制与 RPC、角色移动组件与 Mover、专用服务器。

  1. Source Multiplayer Networking
  2. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization
  3. web.archive.org/web/20200910022723/developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
  4. Yahn W. Bernier, Latency Compensating Methods… (Valve, 2001)

相关页面

游戏开发客户端预测与纠正重放Client-Side Prediction & Reconciliation本地客户端立刻用与服务器相同的运动(及可选武器)代码根据输入推进自己的角色,消除操作往返延迟;服务器仍是权威。权威纠正到达时已是「过去」,客户端丢弃过期缓冲、回绕到纠正状态再重放未确认输入,得到与服务器一致的「现在」。游戏开发快照插值Snapshot Interpolation发送端按固定频率拍下世界(或相关子集)的快照,接收端不跑权威模拟,而是把渲染时刻拨回一小段,在缓冲里的两份快照之间插值,用额外延迟换平滑,并扛住抖动与偶发丢包。Source 的实体插值与 clinterp 是同一思想的产品化。游戏开发多人网络游戏模型Multiplayer Networking Models多人游戏并不是共享同一份物理现实,而是每位玩家各自看到的近似。历史上主要两条路:对等锁步 (Peer-to-Peer Lockstep)(RTS 仍常用)与权威客户端/服务器 (Authoritative Client/Server)(动作/FPS 主流);后者再叠加客户端预测、插值与延迟补偿,把延迟藏进体验里。游戏开发 · UE5网络复制与 RPCNetwork Replication & RPCUE 采用服务器权威 (Server-Authoritative) 的客户端-服务器模型:游戏真正在服务器上进行,服务器把状态复制 (Replication) 给客户端,客户端通过远程过程调用 (Remote Procedure Call, RPC) 向服务器请求操作。开发者需要显式声明哪些 Actor、属性、函数要走网络,并借助所有权、网络角色、相关性、优先级控制“发给谁、发多少”。UE 5.8 提供通用复制系统、Replication Graph 和实验性的 Iris 三套复制系统。游戏开发 · UE5角色移动组件与 MoverCharacter Movement Component & Mover角色移动组件 (CMC) 用「客户端预测 + 服务器校验 + 纠正后重放」实现联网移动:自主代理先在本地移动并把操作存起来,用 ServerMove RPC 发给服务器重演,位置不符时服务器用 ClientAdjustPosition 纠正,客户端再按保存的操作重放;模拟代理只应用复制下来的移动并做平滑。实验性插件 Mover 计划接替 CMC,改用共享时间线、回滚与重模拟的模型,并且更模块化。游戏开发 · UE5专用服务器Dedicated ServerUE 多人游戏采用客户端-服务器模型。监听服务器 (listen server) 由某个玩家的客户端兼任服务器;专用服务器 (dedicated server) 无头运行,不渲染画面,也没有本地玩家。专用服务器体积更小、房主没有不公平优势、能专注于玩法逻辑,适合大规模或竞技游戏。构建专用服务器需要源码版引擎和支持客户端-服务器的 C++ 项目,并要有 <ProjectServer.Target.cs。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原