游戏卡顿白皮书 › 同步设计
延迟补偿过度 Excessive lag compensation
原因 ID sy-lagcomp-overreach · 主责 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
按攻击者的视角回溯得太远时,被打的一方明明已经躲好了,还是会被打中。
起因 为照顾 ping 高的攻击者,服务器大幅回溯后判定 → 结果 在被打者的画面上,自己早已躲到掩体后 → 画面表现 “躲到墙后还被打中”,ping 高的人反而占优
- 症状
- 吞操作/回档
- 因素
- 延迟
- 谁会遇到
- 只有我, 特定地区/运营商
- 何时出现
- 做特定操作时
- 负责方
- 主责 研发团队·服务器开发
- 研发团队要做的事
- 设置回溯上限(例如 200~250 ms),ping 比这更高的攻击者只回溯到上限,剩下的部分由他自己打提前量。
- 监控图上
- 仅部分偏高 · 每次命中的回溯时长(按攻击者 ping)
- 查看位置
- 在服务器判定日志中为每次命中记录回溯时长、攻击者 RTT、被打者进入掩体的服务器时间。在开发版本中把回溯后的判定框画到画面上(Source 引擎用 sv_showlagcompensation)
- 确认依据
- “躲到墙后还被打中”反馈对应的命中集中在回溯时长长的攻击者身上,回溯时长没有上限,随攻击者 ping 一路增加
- 排除依据
- 回溯时长很短的命中也出现墙后中弹,是判定框、碰撞检测的问题。被打者 ping 高时,是他的移动很晚才到达服务器造成的
- 确认手段
- 需要游戏服务器/客户端的日志和指标
- 深入了解
- 回溯判定以“开枪者优先”为原则。也有人提出“被打者优先”的例外:被打的一方在自己画面上已经进入安全位置时就不回溯。
出处
- Peeking into VALORANT's Netcode Riot Games
回溯没有上限时,延迟 500 ms 的人在对方躲进掩体 0.5 秒后仍能打中,所以要设上限 - A Survey and Taxonomy of Latency Compensation Techniques for Network Computer Games (ACM Computing Surveys, 2022) ACM
“拐角后被打中(shot around the corner)”现象,商业 FPS 的回溯上限,提出被打者安全时不回溯的方法 - Source SDK 2013: player_lagcompensation.cpp Valve
Source 引擎的回溯上限 sv_maxunlag 默认 1 秒(最大 1 秒),sv_showlagcompensation 在画面上显示回溯后的判定框
相关原因
同一层:同步设计
其他层中同样导致“吞操作/回档”的原因
查看含图示和实验的原卡片