遊戲 Lag 白皮書 › L1 用戶端遊戲程式
時鐘同步誤差 Clock sync error
原因 ID cg-clock · 主要負責 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
用戶端推估的伺服器時間不準時,內插時間點與冷卻判定就會出現偏差。
為什麼 只在連線時對時一次,ping 改變了也不重新校正 → 於是 內插時間點與冷卻結束時間跟伺服器不一致 → 畫面上 對手偶爾頓一下;冷卻明明結束了,技能卻被拒絕
- 症狀
- 卡頓, 吃指令/回檔
- 因素
- 延遲
- 誰會遇到
- 只有我
- 何時
- 開越久越嚴重, 偶爾隨機發生
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 定期做時間同步(量測往返時間後校正)、逐步校正以免時間突然跳動、用 monotonic clock 量測經過時間,不依賴電腦的系統時間。
- 圖表上
- 緩慢爬升 · 推估伺服器時間的誤差
- 查看位置
- 定期記錄用戶端推估的伺服器時間,與伺服器放在封包裡送來的伺服器時間(tick 編號)之間的差距
- 符合的跡象
- 誤差在連線後隨時間越來越大,或在電腦時鐘被校正的瞬間一次跳開,同一時期技能被拒、頓一下的回報增加
- 不符合的跡象
- 誤差一直很小、技能仍被拒絕時,屬於伺服器判定或延遲的問題
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
- 深入了解
- 用電腦的日期時間(wall clock)量測經過時間時,在 Windows 依網際網路時間校正時鐘,或使用者修改時鐘的瞬間,遊戲時間就會跳動。經過時間必須用不會倒退的 monotonic clock(Stopwatch 等)量測。
出處
- RFC 5905: Network Time Protocol Version 4: Protocol and Algorithms Specification IETF
以請求與回應的四個時間戳記計算往返延遲與時鐘誤差的方式 - Acquiring high-resolution time stamps Microsoft
QueryPerformanceCounter(Stopwatch 所使用)是量測經過時間用的時鐘,不與外部時間同步;只有需要 UTC 時間時才使用系統時間 - Time synchronization (Netcode for Entities 6.5) Unity
以往返時間推估伺服器時間,並透過逐步微調時間前進的速度來對齊,避免時間大幅跳動
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片