遊戲 Lag 白皮書 › L1 用戶端遊戲程式
用戶端預測不一致 Prediction mismatch / reconciliation
原因 ID cg-predict · 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
自己的用戶端已經先顯示移動,伺服器卻算出不同的結果時,自己的角色就會被拉回去。
為什麼 用戶端在伺服器確認前先移動(預測) → 於是 伺服器對碰撞、移動速度、buff 的計算結果不同,或沒收到指令 → 畫面上 確認到達時,自己的角色被往回拉
- 症狀
- 拉回
- 因素
- 遺失, 延遲
- 誰會遇到
- 只有我
- 何時
- 移動中/切換地圖時, 偶爾隨機發生
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 用戶端:使用與伺服器相同的移動程式碼、重複傳送輸入、平滑地校正。伺服器:使用與用戶端相同的移動程式碼,重複收到的輸入依輸入編號過濾,只處理一次。
- 數值參考
- 被拉回的距離是「偏差時間 × 移動速度」。只要掉了幾個指令,就會差 1~3m。
- 圖表上
- 偶爾隨機飆高 · 伺服器校正(預測失敗)次數
- 查看位置
- 記錄伺服器送出的位置校正次數與校正距離。Unreal 計算伺服器的 ClientAdjustPosition 校正次數,Unity Netcode for Entities 計算因預測失敗而回溯重算的次數
- 符合的跡象
- 校正集中在回報拉回的時間點,在特定 buff、地形、位移技能下校正距離反覆偏大
- 不符合的跡象
- 校正只在封包遺失嚴重時集中出現,屬於輸入封包遺失(線路)。沒有校正、只有其他角色看起來被拉回時,是「過度外插(dead reckoning)」
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
出處
- Introduction to prediction (Netcode for Entities 6.5) Unity
用戶端與伺服器以相同的模擬程式碼預測;與伺服器狀態不同(預測失敗)時回溯重算,畫面上會看到校正 - Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
為了因應封包遺失,連同最新輸入重複送出前幾個 tick 的輸入 - Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
用戶端先移動,伺服器重現同樣的移動;位置不同時以 ClientAdjustPosition 校正,再重新套用已儲存的移動
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(拉回)在其他層的原因
查看含圖解與實驗的完整版卡片