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

遊戲 Lag 白皮書 › L1 用戶端遊戲程式

用戶端預測不一致 Prediction mismatch / reconciliation

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

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

自己的用戶端已經先顯示移動,伺服器卻算出不同的結果時,自己的角色就會被拉回去。

為什麼 用戶端在伺服器確認前先移動(預測) → 於是 伺服器對碰撞、移動速度、buff 的計算結果不同,或沒收到指令 → 畫面上 確認到達時,自己的角色被往回拉

症狀
拉回
因素
遺失, 延遲
誰會遇到
只有我
何時
移動中/切換地圖時, 偶爾隨機發生
負責單位
主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
用戶端:使用與伺服器相同的移動程式碼、重複傳送輸入、平滑地校正。伺服器:使用與用戶端相同的移動程式碼,重複收到的輸入依輸入編號過濾,只處理一次。
數值參考
被拉回的距離是「偏差時間 × 移動速度」。只要掉了幾個指令,就會差 1~3m。
圖表上
偶爾隨機飆高 · 伺服器校正(預測失敗)次數
查看位置
記錄伺服器送出的位置校正次數與校正距離。Unreal 計算伺服器的 ClientAdjustPosition 校正次數,Unity Netcode for Entities 計算因預測失敗而回溯重算的次數
符合的跡象
校正集中在回報拉回的時間點,在特定 buff、地形、位移技能下校正距離反覆偏大
不符合的跡象
校正只在封包遺失嚴重時集中出現,屬於輸入封包遺失(線路)。沒有校正、只有其他角色看起來被拉回時,是「過度外插(dead reckoning)」
確認方式
需要遊戲伺服器/用戶端的 log 與指標

出處

  1. Introduction to prediction (Netcode for Entities 6.5) Unity
    用戶端與伺服器以相同的模擬程式碼預測;與伺服器狀態不同(預測失敗)時回溯重算,畫面上會看到校正
  2. Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
    為了因應封包遺失,連同最新輸入重複送出前幾個 tick 的輸入
  3. Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
    用戶端先移動,伺服器重現同樣的移動;位置不同時以 ClientAdjustPosition 校正,再重新套用已儲存的移動

相關原因

同一層:L1 用戶端遊戲程式

同一症狀(拉回)在其他層的原因

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