遊戲 Lag 白皮書 › 同步設計
沒有延遲補償的判定 Server-now hit validation
原因 ID sy-no-lagcomp · 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
伺服器只用「伺服器上現在的位置」判定命中時,判定會與自己看到的畫面不一致。
為什麼 自己畫面上的對手是約 0.2 秒前的位置(ping 150ms、內插 100ms 時) → 於是 伺服器以目前位置判定,對手早已不在自己瞄準的地方 → 畫面上 明明打中了卻判定落空。射擊移動中的目標要預留提前量
- 症狀
- 吃指令/回檔
- 因素
- 延遲
- 誰會遇到
- 只有我
- 何時
- 做特定動作時
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 伺服器:回溯到攻擊者當時看到的時間點再判定(延遲補償),或改成指定目標的方式。用戶端:攻擊時一併送出自己當時看到的時間點(正在內插的伺服器時間)。
- 圖表上
- 只有部分偏高 · 移動目標的命中率(依 ping 區間)
- 查看位置
- 在伺服器判定 log 中一併記錄攻擊時間、攻擊者畫面上的目標位置(用戶端送來的值)、判定時使用的伺服器端目標位置、攻擊者 RTT。在開發版本中把伺服器判定用的位置疊畫在用戶端畫面上,一眼就能看出
- 符合的跡象
- 落空的判定中,兩個位置的差距約為目標速度 ×(攻擊者 RTT + 內插時間),且 ping 越高,只有移動目標的命中率下降
- 不符合的跡象
- 靜止的目標也打不中時,是判定框(hitbox)或碰撞檢測的問題。有做回溯卻仍不一致時,要查用戶端是否把內插時間錯誤告知伺服器
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
出處
- 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 引擎的回溯時間 = 網路延遲 + 內插時間
相關原因
同一層:同步設計
同一症狀(吃指令/回檔)在其他層的原因
查看含圖解與實驗的完整版卡片