Time 類屬性在幀率變化中的範例

以下將說明各種 Time 類中的屬性是如何回報與響應幀率的巨大變化;下面的表格展示了 Unity 執行了 16 幀的情況,其中第 8 幀出現一個大延遲。

Frame unscaledTime time unscaledDeltaTime deltaTime smoothDeltaTime
1 0.000 0.000 0.018 0.018 0.018
2 0.018 0.018 0.018 0.018 0.018
3 0.036 0.036 0.018 0.018 0.018
4 0.054 0.054 0.018 0.018 0.018
5 0.071 0.071 0.017 0.017 0.018
6 0.089 0.089 0.018 0.018 0.018
7 0.107 0.107 0.018 0.018 0.018
8 1.123 0.440 1.016 0.333 0.081
9 1.140 0.457 0.017 0.017 0.066
10 1.157 0.474 0.017 0.017 0.056
11 1.175 0.492 0.018 0.018 0.049
12 1.193 0.510 0.018 0.018 0.042
13 1.211 0.528 0.018 0.018 0.038
14 1.229 0.546 0.018 0.018 0.034
15 1.247 0.564 0.018 0.018 0.031
16 1.265 0.582 0.018 0.018 0.028

在第 1 到第 7 幀中,

  • timeunscaledTime 可以發現這些值穩定的增加,約為 60 幀, timeScale 設為 1 。

在第 8 幀中,出現了超過一秒的大延遲,

  • 當幀延遲超過 maximumDeltaTime 的值時,Unity 會限制 deltaTime 回報的值以及增加到目前時間的量。這個限制的目的是避免如果時間步長超過這個數值可能會發生的不良副作用。
    • 所謂的不良副作用:像這樣的延遲會導致 deltaTime 的值變得非常大。例如,如果延遲超過一秒,deltaTime 可能會超過 1.0 秒。如果一個物體的移動量是透過 deltaTime 縮放的,這樣大的 deltaTime 值會導致物體在一幀內移動非常大的距離,可能直接穿過遊戲中的牆壁或其他障礙物,導致遊戲中不希望看到的「穿牆」現象。

下圖表中可以看到在第 8 幀時, unscaledDeltaTime 超過一秒(1.016),但是 deltaTime 回報的是 0.333 ,這是因為 deltaTimemaximumDeltaTime 限制。


在第 8 幀時, unscaledTime 增加將近一秒(1.123)的時間,但是 time 只增加較小的時間(0.440),這是因為 time 加上的是被限制的 deltaTime (即 maximumDeltaTime 的值)。簡單的說:

  • unscaledTime 代表從遊戲開始到目前幀的真實經過時間,不受限制。
  • time 代表遊戲開始到目前幀的經過時間,但是受 maximumDeltaTime 限制。

Time.smoothDeltaTime 提供了最近一段時間內 deltaTime 的平滑近似值,這種平滑處理可以避免在計算中突然出現的波動,這種平滑的演算法無法預測未來的變化,但是可以讓回報的時間較平滑,因此可以比較符合實際預期的時間。


maximumDeltaTime 也會影響物理系統,物理系統使用 fixedTimestep 值來決定每個固定步長中模擬的時間量。Unity 嘗試保持物理模擬與實際經過的時間同步,有時會在一幀內執行多次物理更新。然而,如果由於某些重計算或延遲導致物理模擬落後太多,系統可能需要多次步驟來追趕當前時間。這種大量的步驟可能進一步導致性能下降。

  • 為了避免由於試圖追趕而導致的逐步減慢,maximumDeltaTime 值還作為物理系統在任何給定兩幀之間模擬時間的上限。
  • 如果一次幀更新的處理時間超過了 maximumDeltaTime,物理引擎將不會試圖模擬超過 maximumDeltaTime 的時間,而是讓幀處理趕上。一旦幀更新完成,物理模擬將恢復,就像它停止後沒有時間流逝一樣。這樣做的結果是,物理物體將不會像通常那樣以完全實時移動,而是會略微減速。然而,物理的「時鐘」仍然會跟踪它們,就好像它們在正常移動一樣。物理時間的減速通常不容易察覺,並且通常是在遊戲性能與實時物理模擬之間的可接受折衷。

返回 時間與幀 大綱

評論