Version: Unity 6.0 (6000.0)
语言 : 中文
每帧更新
处理时间变化

固定更新

与主帧更新不同,Unity 的物理系统会以固定的时间间隔进行更新,这对于模拟的准确性和一致性很重要。固定更新之间的间隔通常称为固定时间步长。可以通过两种方式读取或更改固定时间步长:

  • 在代码中,通过设置 Time.fixedDeltaTime 属性的值。
  • 在 Unity Editor 的时间 (Time) 窗口中,通过修改固定时间步长 (Fixed Timestep) 值。

在这两种情况下,固定时间步长的单位都是秒。例如,值为 0.01 表示每个固定时间步长为百分之一秒,因此每秒有 100 次固定更新。

固定更新循环模拟以固定时间间隔运行的代码,但实际上固定更新之间的间隔不是固定的。这是因为固定更新始终需要一个帧来运行,而帧的持续时间和固定时间步长并不完全同步。如果固定时间步长在当前帧期间完成,则关联的固定更新在下一帧之前无法运行。当帧率较低时,单个帧可能跨越多个固定时间步长。在这种情况下,在当前帧期间会累积大量固定更新积压,Unity 会在下一帧执行所有这些更新以赶上进度。

注意:存在一个最大时间步长,超过此时间步长,Unity 将不会尝试跟上模拟的进度。有关更多信息,请参阅处理时间变化

Unity 提供 MonoBehaviour.FixedUpdate 方法作为入口点,供您在每次固定更新时执行自己的代码。这最常用于执行您自己的物理相关代码,例如对刚体施加力

可以在执行顺序图图表的物理 (Physics) 部分中看到在固定更新周期中所发生情况的更多详细信息。

当帧率高于固定更新率时

如果应用程序的帧率高于每秒固定时间步数,则平均帧持续时间会小于单个固定时间步长的持续时间。在这种情况下,每帧都有一个固定更新或根本没有更新。例如,如果固定时间步长值为 0.02,则每秒应该有 50 次固定更新。如果应用程序以 80 帧/秒的速度运行,则每两帧或三帧都会发生一次固定更新,如下所示。

示例显示了 FixedUpdate 以每秒 50 次更新(每次固定更新 0.02s)的速度运行,播放器循环以每秒大约 80 帧的速度运行。如果在一帧开始时一个新的完整固定时间步长已经过去,那么一些帧更新(以黄色标记)会有一个对应的 FixedUpdate(以绿色标记)。
示例显示了 FixedUpdate 以每秒 50 次更新(每次固定更新 0.02s)的速度运行,播放器循环以每秒大约 80 帧的速度运行。如果在一帧开始时一个新的完整固定时间步长已经过去,那么一些帧更新(以黄色标记)会有一个对应的 FixedUpdate(以绿色标记)。

此图显示的帧率比固定更新时间步长速率运行得更快。时间向右推进,每帧都有编号,并在帧首以橙色显示其 Update 调用。此处的固定时间步长为 0.02 秒(每秒 50 次),游戏运行速度较快,约为每秒 80 帧。在这种情况下,有些帧具有一个固定更新调用,而有些帧没有,具体取决于帧开始时是否已完成一个完整的固定更新时间步。固定时间步长周期用字母 A、B、C、D、E 标记,发生相应固定更新调用的帧则用绿色标记。时间步长 A 的固定更新调用发生在第 4 帧的开头,时间步长 B 的固定更新调用发生在第 7 帧的开头,依此类推。

当帧率低于固定更新率时

如果应用程序以比固定时间步长值低的帧率运行,则平均帧持续时间要大于单个固定时间步长。这意味着在某些帧期间,固定更新的积压可能会不断增加,因此每一帧会有一个或多个固定更新,以便物理模拟能够赶上积压的更新量。例如,如果固定时间步长值为 0.01,则每秒应该有 100 次固定更新。如果应用程序以 40 帧/秒的速度运行,Unity 平均每帧执行两到三次固定更新,以保持同步。当更准确的物理建模比高帧率更重要时,您可以需要这样的场景。

示例显示了以 25 FPS 速度运行的更新,以及以 100 个更新/秒的更新速度运行的 FixedUpdate。可以看到在一帧中有四次 FixedUpdate,以黄色标记。
示例显示了以 25 FPS 速度运行的更新,以及以 100 个更新/秒的更新速度运行的 FixedUpdate。可以看到在一帧中有四次 FixedUpdate,以黄色标记。

此图显示了当固定更新周期的运行速度超过帧率时会发生的情况。此处的固定时间步长为 0.01 秒(每秒 100 次),游戏帧率较慢,约为 40 帧/秒。在这种情况下,大多数帧在每次更新调用之前都有多个固定更新调用,该数量取决于自上一帧开始已经过去了多少个完整的更新时间步长。固定更新时间步长周期用字母 A、B、C(依此类推)标记,发生相应固定更新调用的帧则用绿色标记。时间步长 A 和 B 的固定更新调用发生在第 2 帧的开头,帧 C、D 和 E 的固定更新调用发生在第 3 帧的开头,依此类推。

注意:较低的时间步长值意味着更频繁的物理更新和更精确的模拟,这会导致更高的 CPU 负载。

其他资源

每帧更新
处理时间变化