遊戲 Lag 白皮書 › L1 用戶端遊戲程式
固定時間步長追趕失控 Fixed-timestep catch-up / spiral of death
原因 ID cg-fixed-step · 主要負責 遊戲開發團隊(用戶端開發)
在含圖解與實驗的完整版中開啟卡片 →
停過一次之後集中補算落後的部分,又因為這些計算而再度落後。
為什麼 以固定間隔執行的遊戲模擬停了一次 → 於是 把積欠的每一步集中在一個畫格內算完 → 畫面上 長畫格接連出現而飆高,或碰到上限使整個世界變慢
- 症狀
- 卡頓, 快轉, 慢動作
- 因素
- 停滯
- 誰會遇到
- 只有我
- 何時
- 偶爾隨機發生, 人潮湧入時
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發)
- 遊戲開發團隊要做的事
- 設定每個畫格的追趕上限,剩餘的時間以內插處理。
- 圖表上
- 偶爾隨機飆高 · 畫格時間、每畫格的固定步數
- 查看位置
- 在開發版本的 profiler 同時查看一個畫格內固定步長執行了幾次(Unity 看 FixedBehaviourUpdate 等 FixedUpdate 階段標記的數量)與畫格時間
- 符合的跡象
- 一個長畫格之後,接連出現多次執行步長的長畫格;碰到上限(Unity 的 Maximum Allowed Timestep)時,遊戲時間比實際時間走得慢
- 不符合的跡象
- 長畫格只出現一次就結束時,是「畫格時間尖峰」或「用戶端垃圾回收」
- 確認方式
- 需要遊戲伺服器/用戶端的 log 與指標
- 深入了解
- Unity 的物理計算(FixedUpdate)是典型的固定步長(預設 0.02 秒,每秒 50 次)。Time 設定中的 Maximum Allowed Timestep(一個畫格最多追趕的時間,預設約 0.33 秒)就是追趕上限。一個畫格比這更長時,超出的時間會被捨棄,遊戲時鐘也就比實際時間慢了這麼多。
出處
- Set fixed timestep to optimize physics simulation frequency Unity
Fixed Timestep 預設值 0.02 秒(每秒 50 次);畫格一長,一個畫格內就要執行好幾次物理步長,負擔變大 - Handling variation in time Unity
Maximum Allowed Timestep 預設值 1/3 秒(0.3333333);即使停了 1 秒,遊戲時間也只前進 0.333 秒,這個上限用來防止追趕步長再拖慢畫格的惡性循環 - Profiler markers reference Unity
FixedBehaviourUpdate:MonoBehaviour.FixedUpdate 的執行區段;物理標記在 FixedUpdate 階段呼叫
相關原因
同一層:L1 用戶端遊戲程式
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片