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

遊戲 Lag 白皮書 › L1 用戶端遊戲程式

沒有內插緩衝或緩衝太短 Missing/short interpolation buffer

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

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

一收到伺服器封包就立刻繪製時,抖動(封包抵達間隔忽長忽短)會原封不動地出現在畫面上。

為什麼 收到位置就直接繪製,或緩衝比抖動還短 → 於是 封包晚到多久就停多久,一次湧入多少就跳多少 → 畫面上 其他角色走走停停,一頓一頓地移動

症狀
卡頓
因素
抖動
誰會遇到
只有我
何時
一直都有
負責單位
主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
用戶端:加入內插緩衝,依線路狀態自動調整緩衝長度。伺服器:套用延遲補償(回溯判定),讓玩家看著緩衝時間之前的畫面射擊,判定也正確。
數值參考
一般會保留約為伺服器封包傳送間隔 2 倍的緩衝(每秒收到 20 次時為 100ms)。
圖表上
一開始就一直偏高 · 封包抵達間隔、內插緩衝變空的次數
查看位置
在用戶端記錄伺服器封包的抵達間隔分布,以及因為沒有下一個可內插的快照而停住或改用外插的畫格數
符合的跡象
抵達間隔的波動經常超過內插緩衝長度,每次緩衝都會變空、其他角色頓一下。加長緩衝後減少
不符合的跡象
緩衝足夠卻仍會頓一下時,確認伺服器的傳送間隔本身是否不規律(tick 延遲)
確認方式
需要遊戲伺服器/用戶端的 log 與指標
深入了解
加長緩衝會更流暢,但看到的對手也會落後同樣的時間。因此攻擊判定會搭配延遲補償,由伺服器回溯到「那位玩家當時看到的過去」來確認。

出處

  1. Interpolation and extrapolation (Netcode for Entities 6.5) Unity
    緩衝內插為了等待晚到的封包而刻意延後繪製;緩衝越大越準確,延遲也跟著增加
  2. Struct ClientTickRate (Netcode for Entities 6.5) Unity
    內插緩衝預設值 InterpolationTimeNetTicks = 2(伺服器傳送 2 次的份量)
  3. Physics (Netcode for Entities 6.5) Unity
    延遲補償:伺服器找出用戶端在那個 tick 看到的碰撞世界,據此判定是否命中

相關原因

同一層:L1 用戶端遊戲程式

同一症狀(卡頓)在其他層的原因

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