遊戲 Lag 白皮書 › 同步設計
沒有時間戳記、一到就播放 Events played on arrival (no timestamps)
原因 ID sy-no-timestamp · 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
伺服器事件沒有附上發生時間、一收到就播放時,網路抖動會讓演出時機跟著忽快忽慢。
為什麼 「開始攻擊」、「播放特效」事件一抵達就執行 → 於是 每個封包的抵達時間不同,間隔忽長忽短 → 畫面上 連續攻擊動作忽快忽慢,王的招式時機每次都不一樣
- 症狀
- 卡頓, 快轉
- 因素
- 抖動
- 誰會遇到
- 只有我
- 何時
- 一直都有
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 用戶端:依事件附帶的時間播放(事件排程、內插緩衝)。伺服器:在事件上附上發生時間(伺服器時間)再送出。
- 圖表上
- 偶爾隨機飆高 · 事件播放間隔、封包抵達間隔
- 查看位置
- 用事件編號對齊伺服器 log 的事件發生時間與用戶端 log 的抵達、播放時間,比較間隔。在開發版本加入抖動(tc netem 的抖動值、Unreal 網路模擬的最小/最大延遲)來重現
- 符合的跡象
- 伺服器上的發生間隔固定,播放間隔卻完全跟著抵達間隔忽長忽短
- 不符合的跡象
- 抵達間隔均勻、播放卻忽快忽慢時,是用戶端畫格的問題(畫格時間尖峰)。伺服器的發生間隔本身就不穩時,是超出 tick 預算
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
出處
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
每個更新都附上伺服器時間,以目前時間減去內插時間(100ms)的目標時間點位置來繪製 - Snapshot Interpolation Gaffer On Games
收到快照就直接繪製會因抖動而斷斷續續,先在內插緩衝稍微累積再繪製就會很流暢 - NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
在 RPC 中放入送出時間,讓接收端依伺服器時間播放效果的範例 - tc-netem(8) — Linux manual page iproute2
對送出的封包加入延遲、抖動(delay TIME JITTER)與遺失(loss random PERCENT),模擬真實網路的測試工具 - Using Network Emulation in Unreal Engine Epic Games
在伺服器、用戶端加入最小/最大延遲與封包遺失比例來測試,在主控台以 NetEmulation.PktLag 這類指令設定
相關原因
同一層:同步設計
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片