繁体   English   中英

Unity 中的 Update 和 FixedUpdate 有什么区别?

[英]what is the difference between Update & FixedUpdate in Unity?

UpdateFixedUpdate方法有什么区别,什么时候应该使用这些方法?

来自论坛

更新每帧运行一次。 FixedUpdate 可以每帧运行一次、零次或多次,具体取决于时间设置中设置的每秒物理帧数以及帧速率的快/慢。

两者区别的详细解释也可以参考同论坛duck给出的答案。

正是出于这个原因,在施加力、扭矩或其他与物理相关的函数时应该使用 FixedUpdate - 因为您知道它将与物理引擎本身完全同步地执行。

而 Update() 可能与物理引擎不同步,更快或更慢,这取决于图形在任何给定时间对渲染引擎施加的负载量,如果用于物理,则会给出相应的变体物理效果!

FixedUpdate用于与物理引擎同步,因此任何需要应用于刚体的事情都应该发生在 FixedUpdate 中。 另一方面,更新独立于物理引擎工作。 如果用户的帧率下降但您需要进行一定的计算以继续执行,这可能是有益的,例如,如果您正在更新聊天或 voip 客户端,则需要定期进行旧更新。

Unity 在这里有一个关于 Update vs. FixedUpdate 的精彩视频: Unity - Update vs. FixedUpdate

该站点是初学者游戏程序员的绝佳资源。

添加到其他答案中,更新与帧速率同步,而不是物理计算速率。 这意味着通常当某些东西改变视觉效果时,您希望在 Update 中完成它,而不是 FixedUpdate。 这确保了它总是在渲染帧的那一刻及时。 我遇到过很多运动看起来不流畅的情况,因为我在 FixedUpdate 中进行了计算。

在 Update 中完成某些应该在 FixedUpdate 中完成的唯一潜在成本是您的物理保真度可能会下降,尤其是在您达到低帧速率时(但通常这是一个应该修复的单独问题,所以通常不会一个很好的理由在 FixedUpdate 而不是 Update 中放置一些东西)。

如果您希望控制不同脚本执行更新的顺序,FixedUpdate 是错误的树。 您应该改用 EarlyUpdate之类的东西。

Update():包含必须通过可视化渲染执行的代码

FixedUpdate():包含必须与物理交互同步的代码

来源: https ://youtu.be/noXtT_zN-84?t=3057

我注意到这里的大多数答案都清楚地解释了FixedUpdate的用途以及何时使用它。 但是,我没有看到任何关于何时应该使用常规Update的明确示例。 以下来自官方 Unity 教程

Update()

  • 调用每一
  • 用于定期更新,例如:
    • 移动非物理对象
    • 简单的计时器
    • 接收输入(又名按键等)
  • 更新间隔调用时间会有所不同,即间隔不均匀

FixedUpdate()

  • 调用每个物理步骤
  • FixedUpdate()间隔是一致的,即均匀间隔
  • 用于定期更新,例如调整物理(例如刚体)对象

我发现OncaLupe 的这个答案是最好的解释:

对于其他可能不知道区别的人:更新以与游戏帧速率相同的频率运行。 如果您获得 100 FPS,则 Update() 每秒运行 100 次。 FixedUpdate() 以恒定的 50 FPS 运行以匹配物理引擎。

仅使用 FixedUpdate 本身并没有错,因为它与物理引擎匹配,所以物理计算和更改应该进行。 但是,如果您正在执行诸如手动移动非物理对象之类的操作并且您的游戏以更高的帧速率运行,您可能会注意到移动时断时续,因为有些帧没有任何移动。 使用更新确保移动发生在每个视觉帧。

此外,如果您需要使用仅在按下按钮而不是按住按钮时触发的输入(跳跃、单发武器等),您可能会在 FixedUpdate 中错过它们。 GetButtonDown/GetButtonUp 之类的设置仅在用户按下按钮时为游戏的一帧设置,并在下一帧返回 false。

最后,这一切都取决于您的游戏以及您如何设置或编程。 如果仅使用 FixedUpdate 对您有用,那么您可以自由地坚持下去。 只需意识到存在一些限制,例如缺少一帧触发器以及非物理运动可能会出现运动卡顿。

对于使用它的每个脚本,每帧都会调用一次Update 几乎所有需要定期更改或调整的内容都发生在update中。 非物理对象的移动、简单的计时器和输入检测都在这里设置。 不按常规时间线调用Update 如果处理一帧的时间比处理下一帧的时间长,则更新调用之间的时间将不同。

FixedUpdate有一些不同之处:

  • 它在常规时间线上被调用,并且调用之间的时间相同

  • FixedUpdate() 具有以固定时间步长运行的优点,有助于时间相关但与帧速率无关的任务。

  • 在调用FixedUpdaet之后,立即进行任何必要的物理计算。 例如,任何影响刚体的东西,即物理对象,都应该在 FixedUpdate 中执行。

  • FixedUpdate循环中编写物理脚本时,最好使用力进行移动。 任何与物理或刚体相关的代码总是在 FixedUpdate 方法中,而不是在 Update 或其他 MonoBehavior 方法中

  • 在 FixedUpdate 中检查输入有时会导致输入丢失甚至双重输入,因为它不是每帧运行一次。 这就是为什么我们应该在Update中检查输入,然后在FixedUpdate中施加力或设置速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM