# Fixed Updates

> Updates which happen at a configurable fixed time interval.

## 固定更新##fixed-updates

与主[帧更新](/engine/6000.0/manual/scripting/object-oriented-development/managing-time-and-frame-rate/time-per-frame-updates.md)不同，Unity 的物理系统会以固定的时间间隔进行更新，这对于模拟的准确性和一致性很重要。固定更新之间的间隔通常称为固定时间步长。可以通过两种方式读取或更改固定时间步长：

* 在代码中，通过设置 [`Time.fixedDeltaTime`](/engine/6000.0/script-reference/unity-engine/time/fixed-delta-time.md) 属性的值。
* 在 Unity Editor 的[时间 (Time)](/engine/6000.0/manual/unity-editor/editor-features/comp-manager-group/class-time-manager.md) 窗口中，通过修改**固定时间步长 (Fixed Timestep)** 值。

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

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

\*\*注意：\*\*存在一个最大时间步长，超过此时间步长，Unity 将不会尝试跟上模拟的进度。有关更多信息，请参阅[处理时间变化](/engine/6000.0/manual/scripting/object-oriented-development/managing-time-and-frame-rate/time-handling-variations.md)。

Unity 提供 [`MonoBehaviour.FixedUpdate`](/engine/6000.0/script-reference/unity-engine/mono-behaviour/fixed-update.md) 方法作为入口点，供您在每次固定更新时执行自己的代码。这最常用于执行您自己的物理相关代码，例如对[刚体](/engine/6000.0/script-reference/unity-engine/rigidbody.md)[施加力](/engine/6000.0/script-reference/unity-engine/rigidbody/add-force.md)。

可以在[执行顺序图](/engine/6000.0/manual/scripting/object-oriented-development/event-handling/execution-order.md)图表的**物理 (Physics)** 部分中看到在固定更新周期中所发生情况的更多详细信息。

## 当帧率高于固定更新率时##when-frame-rate-is-higher-than-the-fixed-update-rate

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


**示例显示了 FixedUpdate 以每秒 50 次更新（每次固定更新 0.02s）的速度运行，播放器循环以每秒大约 80 帧的速度运行。如果在一帧开始时一个新的完整固定时间步长已经过去，那么一些帧更新（以黄色标记）会有一个对应的 FixedUpdate（以绿色标记）。:**
![](/api/media?file=/engine/6000.0/media/images/TimingFixedUpdateFastFPS.png)

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

## 当帧率低于固定更新率时##when-frame-rate-is-lower-than-the-fixed-update-rate

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


**示例显示了以 25 FPS 速度运行的更新，以及以 100 个更新/秒的更新速度运行的 FixedUpdate。可以看到在一帧中有四次 FixedUpdate，以黄色标记。:**
![](/api/media?file=/engine/6000.0/media/images/TimingFixedUpdateSlowFPS.png)

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

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

## 其他资源##additional-resources

* [管理可变帧率](/engine/6000.0/manual/scripting/object-oriented-development/managing-time-and-frame-rate/time-per-frame-updates.md)
* [处理时间变化](/engine/6000.0/manual/scripting/object-oriented-development/managing-time-and-frame-rate/time-handling-variations.md)
* [时间和物理系统](/engine/6000.0/manual/time-and-the-physics-system.md)
* [时间标度](/engine/6000.0/manual/scripting/object-oriented-development/managing-time-and-frame-rate/time-scale.md)
* [捕获帧率](/engine/6000.0/manual/scripting/object-oriented-development/managing-time-and-frame-rate/time-capture-frame-rate.md)
