与主要 帧更新 不同,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 负载。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.