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

遊戲 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 秒)就是追趕上限。一個畫格比這更長時,超出的時間會被捨棄,遊戲時鐘也就比實際時間慢了這麼多。

出處

  1. Set fixed timestep to optimize physics simulation frequency Unity
    Fixed Timestep 預設值 0.02 秒(每秒 50 次);畫格一長,一個畫格內就要執行好幾次物理步長,負擔變大
  2. Handling variation in time Unity
    Maximum Allowed Timestep 預設值 1/3 秒(0.3333333);即使停了 1 秒,遊戲時間也只前進 0.333 秒,這個上限用來防止追趕步長再拖慢畫格的惡性循環
  3. Profiler markers reference Unity
    FixedBehaviourUpdate:MonoBehaviour.FixedUpdate 的執行區段;物理標記在 FixedUpdate 階段呼叫

相關原因

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

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

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