遊戲 Lag 白皮書 › 只有部分人遇到的問題
慢的人在別人畫面上快轉移動 Laggy player seen by others (bursty inputs)
原因 ID pt-slow-burst · 主要負責 遊戲開發團隊(伺服器開發) · 協同 外部(外部)
在含圖解與實驗的完整版中開啟卡片 →
線路差的人,輸入會忽快忽慢、成批抵達伺服器。伺服器每個 tick 收到多少就套用多少時,在其他人眼中,那個角色會頓一下後一次走好幾步。
為什麼 慢的人的移動指令,有的 tick 抵達 0 個,有的 tick 一次抵達 2~3 個 → 於是 伺服器在收到的 tick 一次全部套用,那個角色的位置呈階梯式變化 → 畫面上 在其他人畫面上,只有那個角色頓一下後一次快轉移動。其他都正常
- 症狀
- 快轉, 瞬移
- 因素
- 抖動, 遺失
- 誰會遇到
- 只有特定角色看起來怪怪的, 特定地區/電信業者
- 何時
- 一直都有, 移動中/切換地圖時
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發) · 協同 外部(外部)
- 遊戲開發團隊要做的事
- 用每位玩家各自的輸入緩衝把指令平均分配套用,依輸入序號按原本的間隔套用;只加長其他人畫面上的內插緩衝並不夠(因為伺服器記錄的位置本身就是階梯狀)。
- 外部要做的事
- 引導慢的玩家改用有線連線,並檢查 Wi-Fi 與分享器。
- 數值參考
- 抖動 80ms 時,在 20 tick(50ms)伺服器上,每個 tick 的指令數會在 0~3 個之間波動。
- 圖表上
- 只有部分偏高 · 各玩家每個 tick 套用的指令數、各玩家的抖動
- 查看位置
- 在伺服器端封包擷取中只篩選被回報玩家送出的封包,計算每個 tick 間隔(例:50ms)抵達幾個,並與其他玩家比較。有伺服器 log 的話,查看各玩家每個 tick 套用的移動指令數與輸入序號
- 符合的跡象
- 只有被回報玩家的封包在每個 tick 間 0 個與 2~3 個之間跳動、成批抵達,且該玩家的抖動、封包遺失偏高,其他玩家的封包則均勻抵達。該玩家改用有線後會減少
- 不符合的跡象
- 多個角色同時快轉時,是伺服器 tick 延遲或觀看者那端的線路。抵達與套用都均勻、卻只有那個角色看起來亂跳時,是觀看端的內插或顯示問題
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
- 深入了解
- 在伺服器權威架構下,這是正常行為。一個慢的人造成的 lag,在別人眼中只會呈現為「那個人動作怪怪的」,不會影響其他人的操作或怪物的動作。只是與那個人直接往來的事(交易、隊伍機制、PvP 判定)也會跟著延遲。
出處
- Peeking into VALORANT's Netcode Riot Games
伺服器把抵達的輸入依 tick 順序放入每位玩家的移動佇列,空了就用預測補上。校正只有該玩家看得到,其他人看到的是流暢的畫面 - State Synchronization Gaffer On Games
即使每秒送 60 次,封包也會成批抵達,例如某個畫格 2 個、下一個畫格 0 個 - Source SDK 2013: player.cpp Valve
把成批湧入的指令分散到各伺服器 tick 處理(meter out)
相關原因
同一層:只有部分人遇到的問題
同一症狀(快轉)在其他層的原因
查看含圖解與實驗的完整版卡片