遊戲 Lag 白皮書 › 同步設計
指令同步的路徑計算不一致 Command sync with divergent pathing
原因 ID sy-path-mismatch · 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
只互傳「走到這裡」、路徑由兩邊各自計算時,計算只要有一點不同,角色或怪物就會走上不同的路徑,再被拉回原位。
為什麼 點擊移動、怪物追擊時只送目的地,路徑由用戶端另外計算 → 於是 因地形資料差異、與其他角色碰撞、計算順序不同,走上與伺服器不同的路徑 → 畫面上 怪物穿牆走到一半一下子被移走,點擊移動的角色像滑行般轉向
- 症狀
- 瞬移, 拉回
- 因素
- 延遲
- 誰會遇到
- 特定地點/頻道, 只有我
- 何時
- 移動中/切換地圖時
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 伺服器:連同路徑的中間點(waypoint)一起送出,定期同步位置。用戶端:差異要平滑收斂,使用與伺服器相同的地形資料。
- 圖表上
- 偶爾隨機飆高 · 各物件的位置校正次數、距離
- 查看位置
- 為每個物件記錄伺服器送來的位置與用戶端計算位置的差距,並把發生校正的座標標在地圖上。把兩邊的路徑結果或位置彙整成檢查碼(checksum)定期比較,就能找出開始出現差異的時間點
- 符合的跡象
- 校正集中在特定地形(門檻、狹窄通道、斜坡)或擁擠的地方,網路指標正常的玩家也會在同一個位置反覆發生
- 不符合的跡象
- 與地點無關、只在封包遺失或抖動飆高的瞬間才校正時,是線路問題。一隻怪物在多人畫面上同時亂跳時,要查怪物控制權是否在慢速用戶端上
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
- 深入了解
- 點擊移動、Tab 鎖定目標的遊戲對 ping 不敏感,原因之一就是這種方式。代價是無法保證兩邊結果相同,一定要有不時對齊位置的機制。浮點數運算的結果可能依 CPU 種類、編譯器及其最佳化設定(包括 debug 與 release 建置的差異)而有些微不同。在 lockstep、rollback 這類只交換輸入、假設兩邊計算結果完全相同的架構中,這些小差異會累積起來,可能讓兩邊畫面的遊戲狀態分歧,造成不一致(desync)。
出處
- Deterministic Lockstep Gaffer On Games
即使在同一台機器上是決定性的,編譯器、OS、CPU 不同時浮點數結果仍可能不同 - State Synchronization Gaffer On Games
連同輸入一起送出狀態,就算沒有完美的決定性也能讓兩邊一致 - Peeking into VALORANT's Netcode Riot Games
封包遺失,或兩個角色要走到同一個位置時,伺服器與用戶端的模擬會出現差異,需要校正 - 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond Game Developer
極小的差異隨時間擴大,讓村民的路徑逐漸偏移。以檢查碼比較世界、物件、尋路結果來找出不同步(out-of-sync) - Floating Point Determinism Gaffer On Games
同樣的浮點數程式碼,結果也可能因編譯器、CPU 架構、debug/release 建置而不同。AMD 與 Intel CPU 在超越函數上算出略有不同值的案例 - /fp (Specify floating-point behavior) Microsoft
/fp:fast 會重新排列或合併浮點運算,結果可能與其他 /fp 設定不同;以 FMA 合併的運算也可能與分開相乘再相加的結果不同
相關原因
同一層:同步設計
同一症狀(瞬移)在其他層的原因
查看含圖解與實驗的完整版卡片