游戏卡顿白皮书 › 同步设计
没有延迟补偿的判定 Server-now hit validation
原因 ID sy-no-lagcomp · 主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
服务器只按“当前服务器上的位置”判定命中时,自己看到的画面就会与判定结果对不上。
起因 自己画面上的对手是约 0.2 秒前的位置(ping 150 ms、插值 100 ms 时) → 结果 服务器按当前位置判定,自己瞄准的地方对手已经不在了 → 画面表现 明明打中了却判定未命中。打移动目标必须打提前量
- 症状
- 吞操作/回档
- 因素
- 延迟
- 谁会遇到
- 只有我
- 何时出现
- 做特定操作时
- 负责方
- 主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
- 研发团队要做的事
- 服务器:回溯到攻击者当时看到的时间点再判定(延迟补偿),或改为锁定目标的方式。客户端:攻击时一并发送自己当时看到的时间点(正在插值的服务器时间)。
- 监控图上
- 仅部分偏高 · 移动目标命中率(按 ping 区间)
- 查看位置
- 在服务器判定日志中同时记录攻击时刻、攻击者画面上的目标位置(客户端发来的值)、判定所用的服务器端目标位置、攻击者 RTT。在开发版本中把服务器判定所用的位置叠画到客户端画面上,一眼就能看出来
- 确认依据
- 未命中的判定中,两个位置的差约等于目标速度 ×(攻击者 RTT + 插值时间),ping 越高,只有移动目标的命中率下降
- 排除依据
- 静止目标也打不中,是判定框、碰撞检测的问题。做了回溯仍然对不上,看客户端是否把插值时间错误地告诉了服务器
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
没有延迟补偿时,必须按延迟量提前瞄准。延迟补偿是服务器按延迟和插值时间回溯后再判定 - Peeking into VALORANT's Netcode Riot Games
服务器回溯到射击瞬间玩家看到的游戏状态判定命中,客户端一并发送自己当时看到的模拟时间 - Source SDK 2013: player_lagcompensation.cpp Valve
Source 引擎的回溯时长 = 网络延迟 + 插值时间
相关原因
同一层:同步设计
其他层中同样导致“吞操作/回档”的原因
查看含图示和实验的原卡片