版本:Unity 6 (6000.0)
语言:English
每帧更新
处理时间变化

固定更新

与主要 帧更新 不同,Unity 的物理系统以固定的时间间隔更新,这对于物理模拟的准确性和一致性非常重要。固定更新之间的间隔通常称为 固定时间步长一个可自定义的与帧率无关的间隔,用于确定何时执行物理计算和 FixedUpdate() 事件。 更多信息
请参阅 术语表
。您可以通过两种方式读取或更改固定时间步长

  • 在代码中,通过设置 Time.fixedDeltaTime 属性的值。
  • 在 Unity 编辑器的 时间 窗口中,通过修改 固定时间步长 值。

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

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

注意: 存在一个最大时间步长周期,超过该周期,Unity 不会尝试赶上模拟。有关更多信息,请参阅 处理时间变化

Unity 提供 MonoBehaviour.FixedUpdate 方法作为入口点,供您在每个固定更新时执行自己的代码。这最常用于执行您自己的物理相关代码,例如 刚体一个组件,允许游戏对象受模拟重力和其它力影响。 更多信息
请参阅 术语表
施加力

您可以在 执行顺序图 图的 物理 部分中查看固定更新周期中发生的更多详细信息。

当帧率高于固定更新速率时

如果您的应用程序运行的帧率高于每秒的固定时间步长数,那么平均帧持续时间将小于单个固定时间步长的持续时间。在这种情况下,每个帧只有一个固定更新或根本没有固定更新。例如,如果固定时间步长值为 0.02,则每秒有 50 个固定更新。如果您的应用程序以 80 帧/秒在运行的游戏中连续帧显示的频率。 更多信息
请参阅 术语表
运行,则每两到三帧就会发生一次固定更新,如下所示。

An example showing FixedUpdate running at 50 updates per second (0.02s per fixed update) and the Player Loop running at approximately 80 frames per second. Some frame updates (marked in yellow) have a corresponding FixedUpdate (marked in green) if a new complete fixed timestep has elapsed by the start of the frame.
一个示例,显示 FixedUpdate 以每秒 50 次更新(每次固定更新 0.02 秒)运行,而 Player Loop 以大约每秒 80 帧运行。如果在帧开始时已完成新的完整固定时间步长,则某些帧更新(以黄色标记)具有相应的 FixedUpdate(以绿色标记)。

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

当帧率低于固定更新速率时

如果您的应用程序运行的帧率低于固定时间步长值,那么平均帧持续时间将长于单个固定时间步长。这意味着固定更新的积压会在某些帧内累积,因此每个帧都有一个或多个固定更新,以使物理模拟能够赶上积压。例如,如果固定时间步长值为 0.01,则每秒有 100 个固定更新。如果您的应用程序以每秒 40 帧运行,Unity 将平均每帧执行两到三个固定更新,以保持同步。当模拟更精确的物理比拥有更高的帧率更重要时,您可能需要这样的场景。

An example showing Update running at 25 FPS and FixedUpdate running at 100 updates per second. You can see there are four occurrences of a FixedUpdate during one frame, marked in yellow.
一个示例,显示 Update 以 25 FPS 运行,FixedUpdate 以每秒 100 次更新运行。您可以看到在一个帧内,FixedUpdate 有四次出现,以黄色标记。

该图显示了固定更新周期运行速度快于帧率时发生的情况。这里固定时间步长为 0.01 秒(每秒 100 次),游戏帧率运行速度更慢,大约为每秒 40 帧。在这种情况下,大多数帧在每次更新调用之前都有多个固定更新调用,具体数量取决于自上一帧以来已完成的完整更新时间步长数量。固定更新时间步长周期用字母 A、B、C 等标记,其对应固定更新调用发生的帧用绿色标记。时间步长 A 和 B 的固定更新调用发生在帧 2 的开始处,时间步长 C、D 和 E 的固定更新调用发生在帧 3 的开始处,依此类推。

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

其他资源

每帧更新
处理时间变化