遊戲 Lag 白皮書 › 只有部分人遇到的問題
各玩家的輸入緩衝大小 Per-player server input buffer (jitter buffer)
原因 ID pt-input-buffer · 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
伺服器替每個人暫存一點輸入、每個 tick 取出一個使用時,在其他人眼中很流暢,但本人的動作在伺服器上確定的時間點也會晚上這麼多。
為什麼 伺服器把慢的人的輸入存進緩衝,每個 tick 套用一個 → 於是 緩衝小時經常被取空,那個角色會停在原地,或由伺服器依最後一個輸入推測移動;緩衝大時,本人的輸入會較晚確定 → 畫面上 緩衝小時在別人眼中會頓一下,緩衝大時本人的技能結果較晚出現(輸入延遲)
- 症狀
- 卡頓, 輸入延遲
- 因素
- 抖動
- 誰會遇到
- 只有特定角色看起來怪怪的, 只有我
- 何時
- 一直都有
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發) · 協同 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 伺服器:依每個人的線路狀態自動調整緩衝大小,積壓時一次取出兩個追上進度,並指示緩衝經常取空的人的用戶端提早送出輸入。用戶端:依伺服器指示,把輸入再提早一點送出(調整用戶端時間)。
- 數值參考
- 依遊戲而異,通常是 1~3 tick 的量。VALORANT 的 128 tick 伺服器把伺服器緩衝壓得更短,平均只有半個畫格(約 4ms)。常見做法是自適應,只替抖動大的人加大緩衝。
- 圖表上
- 只有部分偏高 · 各玩家的輸入緩衝長度、取空次數
- 查看位置
- 在伺服器上依玩家記錄每個 tick 輸入緩衝中剩餘的輸入數、緩衝取空而依最後輸入推測補上的次數、從輸入抵達到套用所花的時間
- 符合的跡象
- 緩衝小的人取空次數多,且在那些時刻於別人畫面上短暫停住;緩衝大的人從輸入到套用的時間則多了一個緩衝長度
- 不符合的跡象
- 緩衝幾乎不會取空、別人畫面上卻出現卡頓時,是觀看端的內插問題。緩衝很短、輸入延遲卻很大時,是 RTT 本身或雙重 tick 等待
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
出處
- Peeking into VALORANT's Netcode Riot Games
伺服器調整用戶端的時間基準,讓輸入佇列只維持在延遲最小、又足以吸收不平均抵達的長度。伺服器緩衝目標平均為半個畫格 - NetworkTimeSystem class (Netcode for GameObjects 2.5) Unity
LocalBufferSec:伺服器緩衝用戶端訊息的時間。把用戶端時間提前,讓訊息更早抵達伺服器 - NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
線路差的玩家可以加大緩衝值
相關原因
同一層:只有部分人遇到的問題
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片