한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 Lag 白皮書 › 同步設計

沒有延遲補償的判定 Server-now hit validation

原因 ID sy-no-lagcomp · 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)

在含圖解與實驗的完整版中開啟卡片 →

伺服器只用「伺服器上現在的位置」判定命中時,判定會與自己看到的畫面不一致。

為什麼 自己畫面上的對手是約 0.2 秒前的位置(ping 150ms、內插 100ms 時) → 於是 伺服器以目前位置判定,對手早已不在自己瞄準的地方 → 畫面上 明明打中了卻判定落空。射擊移動中的目標要預留提前量

症狀
吃指令/回檔
因素
延遲
誰會遇到
只有我
何時
做特定動作時
負責單位
主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
遊戲開發團隊要做的事
伺服器:回溯到攻擊者當時看到的時間點再判定(延遲補償),或改成指定目標的方式。用戶端:攻擊時一併送出自己當時看到的時間點(正在內插的伺服器時間)。
圖表上
只有部分偏高 · 移動目標的命中率(依 ping 區間)
查看位置
在伺服器判定 log 中一併記錄攻擊時間、攻擊者畫面上的目標位置(用戶端送來的值)、判定時使用的伺服器端目標位置、攻擊者 RTT。在開發版本中把伺服器判定用的位置疊畫在用戶端畫面上,一眼就能看出
符合的跡象
落空的判定中,兩個位置的差距約為目標速度 ×(攻擊者 RTT + 內插時間),且 ping 越高,只有移動目標的命中率下降
不符合的跡象
靜止的目標也打不中時,是判定框(hitbox)或碰撞檢測的問題。有做回溯卻仍不一致時,要查用戶端是否把內插時間錯誤告知伺服器
確認方式
需要遊戲伺服器/用戶端的 log 與指標

出處

  1. Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
    沒有延遲補償時,必須依延遲預留提前量射擊。由伺服器回溯延遲加內插時間後再判定的延遲補償
  2. Peeking into VALORANT's Netcode Riot Games
    伺服器回溯到射擊瞬間玩家看到的遊戲狀態來判定命中,用戶端一併送出自己看到的模擬時間
  3. Source SDK 2013: player_lagcompensation.cpp Valve
    Source 引擎的回溯時間 = 網路延遲 + 內插時間

相關原因

同一層:同步設計

同一症狀(吃指令/回檔)在其他層的原因

查看含圖解與實驗的完整版卡片