与主要 帧更新 不同,Unity 的物理系统以固定的时间间隔更新,这对于物理模拟的准确性和一致性非常重要。固定更新之间的间隔通常称为 固定时间步长一个可自定义的与帧率无关的间隔,用于确定何时执行物理计算和 FixedUpdate() 事件。 更多信息
请参阅 术语表。您可以通过两种方式读取或更改固定时间步长
Time.fixedDeltaTime
属性的值。在这两种情况下,固定时间步长都以秒为单位指定。例如,值为 0.01 表示每个固定时间步长持续一秒的百分之一,因此每秒有 100 个固定更新。
固定更新循环模拟以固定时间间隔运行的代码,但在实践中,固定更新之间的间隔并不固定。这是因为固定更新始终需要一帧才能运行,并且一帧的持续时间和固定时间步长的长度并不完全同步。如果固定时间步长在当前帧内完成,则关联的固定更新必须等到下一帧才能运行。 当帧率很低时,单个帧可能会跨越多个固定时间步长。在这种情况下,固定更新的积压会在当前帧内累积,Unity 会在下一帧中执行所有这些积压,以赶上进度。
注意: 存在一个最大时间步长周期,超过该周期,Unity 不会尝试赶上模拟。有关更多信息,请参阅 处理时间变化。
Unity 提供 MonoBehaviour.FixedUpdate
方法作为入口点,供您在每个固定更新时执行自己的代码。这最常用于执行您自己的物理相关代码,例如 对 刚体一个组件,允许游戏对象受模拟重力和其它力影响。 更多信息
请参阅 术语表 施加力。
您可以在 执行顺序图 图的 物理 部分中查看固定更新周期中发生的更多详细信息。
如果您的应用程序运行的帧率高于每秒的固定时间步长数,那么平均帧持续时间将小于单个固定时间步长的持续时间。在这种情况下,每个帧只有一个固定更新或根本没有固定更新。例如,如果固定时间步长值为 0.02,则每秒有 50 个固定更新。如果您的应用程序以 80 帧/秒在运行的游戏中连续帧显示的频率。 更多信息
请参阅 术语表 运行,则每两到三帧就会发生一次固定更新,如下所示。
该图显示了帧率运行速度快于固定更新时间步长速率。时间向右推移,每个帧都有编号,并显示其在帧开始时的 Update
调用(橙色)。这里固定时间步长为 0.02 秒(每秒 50 次),游戏运行速度更快,大约为每秒 80 帧。在这种情况下,有些帧有一个固定更新调用,有些帧没有,这取决于帧开始时是否已完成一个完整的固定更新时间步长。固定时间步长周期用字母 A、B、C、D、E 标记,其对应固定更新调用发生的帧用绿色标记。时间步长 A 的固定更新调用发生在帧 4 的开始处,时间步长 B 的固定更新调用发生在帧 7 的开始处,依此类推。
如果您的应用程序运行的帧率低于固定时间步长值,那么平均帧持续时间将长于单个固定时间步长。这意味着固定更新的积压会在某些帧内累积,因此每个帧都有一个或多个固定更新,以使物理模拟能够赶上积压。例如,如果固定时间步长值为 0.01,则每秒有 100 个固定更新。如果您的应用程序以每秒 40 帧运行,Unity 将平均每帧执行两到三个固定更新,以保持同步。当模拟更精确的物理比拥有更高的帧率更重要时,您可能需要这样的场景。
该图显示了固定更新周期运行速度快于帧率时发生的情况。这里固定时间步长为 0.01 秒(每秒 100 次),游戏帧率运行速度更慢,大约为每秒 40 帧。在这种情况下,大多数帧在每次更新调用之前都有多个固定更新调用,具体数量取决于自上一帧以来已完成的完整更新时间步长数量。固定更新时间步长周期用字母 A、B、C 等标记,其对应固定更新调用发生的帧用绿色标记。时间步长 A 和 B 的固定更新调用发生在帧 2 的开始处,时间步长 C、D 和 E 的固定更新调用发生在帧 3 的开始处,依此类推。
注意: 较低的时间步长值表示更频繁的物理更新和更精确的模拟,这将导致更高的 CPU 负载。