遊戲 Lag 白皮書 › L1 用戶端遊戲程式
沒有內插緩衝或緩衝太短 Missing/short interpolation buffer
原因 ID cg-no-buffer · 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
一收到伺服器封包就立刻繪製時,抖動(封包抵達間隔忽長忽短)會原封不動地出現在畫面上。
為什麼 收到位置就直接繪製,或緩衝比抖動還短 → 於是 封包晚到多久就停多久,一次湧入多少就跳多少 → 畫面上 其他角色走走停停,一頓一頓地移動
- 症狀
- 卡頓
- 因素
- 抖動
- 誰會遇到
- 只有我
- 何時
- 一直都有
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 用戶端:加入內插緩衝,依線路狀態自動調整緩衝長度。伺服器:套用延遲補償(回溯判定),讓玩家看著緩衝時間之前的畫面射擊,判定也正確。
- 數值參考
- 一般會保留約為伺服器封包傳送間隔 2 倍的緩衝(每秒收到 20 次時為 100ms)。
- 圖表上
- 一開始就一直偏高 · 封包抵達間隔、內插緩衝變空的次數
- 查看位置
- 在用戶端記錄伺服器封包的抵達間隔分布,以及因為沒有下一個可內插的快照而停住或改用外插的畫格數
- 符合的跡象
- 抵達間隔的波動經常超過內插緩衝長度,每次緩衝都會變空、其他角色頓一下。加長緩衝後減少
- 不符合的跡象
- 緩衝足夠卻仍會頓一下時,確認伺服器的傳送間隔本身是否不規律(tick 延遲)
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
- 深入了解
- 加長緩衝會更流暢,但看到的對手也會落後同樣的時間。因此攻擊判定會搭配延遲補償,由伺服器回溯到「那位玩家當時看到的過去」來確認。
出處
- Interpolation and extrapolation (Netcode for Entities 6.5) Unity
緩衝內插為了等待晚到的封包而刻意延後繪製;緩衝越大越準確,延遲也跟著增加 - Struct ClientTickRate (Netcode for Entities 6.5) Unity
內插緩衝預設值 InterpolationTimeNetTicks = 2(伺服器傳送 2 次的份量) - Physics (Netcode for Entities 6.5) Unity
延遲補償:伺服器找出用戶端在那個 tick 看到的碰撞世界,據此判定是否命中
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片