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

遊戲 Lag 白皮書 › 同步設計

指令同步的路徑計算不一致 Command sync with divergent pathing

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

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

只互傳「走到這裡」、路徑由兩邊各自計算時,計算只要有一點不同,角色或怪物就會走上不同的路徑,再被拉回原位。

為什麼 點擊移動、怪物追擊時只送目的地,路徑由用戶端另外計算 → 於是 因地形資料差異、與其他角色碰撞、計算順序不同,走上與伺服器不同的路徑 → 畫面上 怪物穿牆走到一半一下子被移走,點擊移動的角色像滑行般轉向

症狀
瞬移, 拉回
因素
延遲
誰會遇到
特定地點/頻道, 只有我
何時
移動中/切換地圖時
負責單位
主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
遊戲開發團隊要做的事
伺服器:連同路徑的中間點(waypoint)一起送出,定期同步位置。用戶端:差異要平滑收斂,使用與伺服器相同的地形資料。
圖表上
偶爾隨機飆高 · 各物件的位置校正次數、距離
查看位置
為每個物件記錄伺服器送來的位置與用戶端計算位置的差距,並把發生校正的座標標在地圖上。把兩邊的路徑結果或位置彙整成檢查碼(checksum)定期比較,就能找出開始出現差異的時間點
符合的跡象
校正集中在特定地形(門檻、狹窄通道、斜坡)或擁擠的地方,網路指標正常的玩家也會在同一個位置反覆發生
不符合的跡象
與地點無關、只在封包遺失或抖動飆高的瞬間才校正時,是線路問題。一隻怪物在多人畫面上同時亂跳時,要查怪物控制權是否在慢速用戶端上
確認方式
需要遊戲伺服器/用戶端的 log 與指標
深入了解
點擊移動、Tab 鎖定目標的遊戲對 ping 不敏感,原因之一就是這種方式。代價是無法保證兩邊結果相同,一定要有不時對齊位置的機制。浮點數運算的結果可能依 CPU 種類、編譯器及其最佳化設定(包括 debug 與 release 建置的差異)而有些微不同。在 lockstep、rollback 這類只交換輸入、假設兩邊計算結果完全相同的架構中,這些小差異會累積起來,可能讓兩邊畫面的遊戲狀態分歧,造成不一致(desync)。

出處

  1. Deterministic Lockstep Gaffer On Games
    即使在同一台機器上是決定性的,編譯器、OS、CPU 不同時浮點數結果仍可能不同
  2. State Synchronization Gaffer On Games
    連同輸入一起送出狀態,就算沒有完美的決定性也能讓兩邊一致
  3. Peeking into VALORANT's Netcode Riot Games
    封包遺失,或兩個角色要走到同一個位置時,伺服器與用戶端的模擬會出現差異,需要校正
  4. 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond Game Developer
    極小的差異隨時間擴大,讓村民的路徑逐漸偏移。以檢查碼比較世界、物件、尋路結果來找出不同步(out-of-sync)
  5. Floating Point Determinism Gaffer On Games
    同樣的浮點數程式碼,結果也可能因編譯器、CPU 架構、debug/release 建置而不同。AMD 與 Intel CPU 在超越函數上算出略有不同值的案例
  6. /fp (Specify floating-point behavior) Microsoft
    /fp:fast 會重新排列或合併浮點運算,結果可能與其他 /fp 設定不同;以 FMA 合併的運算也可能與分開相乘再相加的結果不同

相關原因

同一層:同步設計

同一症狀(瞬移)在其他層的原因

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