RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1272449
Accepted
Алексей Шиманский
Алексей Шиманский
Asked:2022-04-20 17:53:15 +0000 UTC2022-04-20 17:53:15 +0000 UTC 2022-04-20 17:53:15 +0000 UTC

FixedUpdate 和 Update 有什么区别?他们什么时候叫?

  • 772

我开始学习Unity3dUpdate() ,我不清楚的一件事是和之间的区别FixedUpdate()。

在我的项目中,我使用该方法Update()并且一切正常。FixedUpdate()方法和通常的有什么区别Update()?

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Алексей Шиманский
    2022-04-20T18:01:09Z2022-04-20T18:01:09Z

    简要说明:Update每帧调用一次,并且FixedUpdate以固定速率调用,与 FPS 无关。在这种情况下,可以在Unity设置中更改频率。

    它的频率取决于计算机能够显示图像的速度。在速度较慢的计算机上调用它的频率Update低于在速度较快的计算机上调用的频率。如果您正在根据时间进行计算,您可以使用 标准化它们Time.deltaTime,这将告诉您自上次调用 以来已经过去了多少时间Update。它通常用于执行与显示相关的任务(例如更新 UI 元素)

    FixedUpdate无论FPS如何,都以固定频率调用。在这种情况下,可以在Unity设置中更改频率。无论图像更新的频率如何,都称为固定。通常用于执行与游戏玩法相关的任务(例如,更新物理)。


    再来一点:

    我将首先编写一些伪代码并在下面添加图表,这可能有助于您理解什么是什么。

    下面的(完全虚构的)代码首先运行适当数量的物理步骤以“赶上”当前时间(并FixedUpdate()在每个步骤中实现它的每个对象上调用)。然后为框架绘制图形,然后Update()是实现它的每个对象。

    var physicsTimeSimulated = 0;
    var lastUpdateTime = 0;    
     
     while (Unity is Running) {
         while (physicsTimeSimulated < Time.time) {
             Engine.ExecutePhysicsStep();
             Engine.FixedUpdate(); // <-- отправляется всем объектам
             physicsTimeSimulated += physicsTimeStep;
         }
     
         deltaTime = Time.time - lastUpdateTime;
         Engine.RenderFrame();
         Engine.Update(); // <-- отправляется всем объектам
         lastUpdateTime = CurrentTime;
     
         // повтор...
     }
    

    如果游戏以低帧率运行,则在每个可见帧渲染之间会有大量物理更新。相反,如果游戏以非常高的帧速率运行,则在某些帧的渲染之间可能没有物理步骤,因为自上一帧渲染以来经过的时间尚未超过一个物理步骤的时间段。

    Unity 可以设置每秒物理更新的次数。默认情况下,这是“0.02”,即 这大约是每秒 50 次物理更新(每个物理步骤模拟发生在百分之二秒以上的运动)。

    因此,对于初学者来说,一个简单的图表显示了十分之一秒的周期。分隔线的点代表百分之一秒。“F”表示方法调用的相等划分FixedUpdate

    0                                                0.1 seconds
    |                                                 |
    .____.____.____.____.____.____.____.____.____.____.___ 
    F         F         F         F         F         F
    

    现在,如果我们的游戏以 100 fps 的速度运行得又快又好,我们将为每个物理步骤提供两个帧渲染,因此Update每个函数调用都有两个函数调用。FixedUpdate

    (“F”代表挑战FixedUpdate,“U”代表Update)

    0                                                0.1
    |                                                 |
    .____.____.____.____.____.____.____.____.____.____.___ 
    F         F         F         F         F         F
    U    U    U    U    U    U    U    U    U    U    U
    

    如果我们的游戏运行速度较慢,比如 30 fps(因此Update每秒 30 个所有函数调用),这意味着我们实际上有时在渲染每一帧之间有多个物理步骤。在每秒 30 帧的情况下,结果将是有时帧之间有两个物理步骤,有时一个,看起来像这样,在前 10 秒内:

    0                                                0.1
    |                                                 |
    .____.____.____.____.____.____.____.____.____.____.___ 
    F         F         F         F         F         F
     U                U               U                U
    

    因此,在大多数正常情况下,您将始终获得每帧所需且恒定的物理步数,并且它们将尽可能快地交错视觉帧更新。

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

    虽然它Update可能与物理引擎不同,更快或更慢,具体取决于图形在当前时间对渲染引擎施加什么样的负载(使用这种物理方法会产生非常量和不正确的工作)

    例外情况是,如果您的场景对物理引擎施加了如此大的负载,以至于它会接近无法完成所需数量的物理时间步以跟上“实时”的程度。这意味着您的游戏已经无法实时模拟,在这种情况下,您需要认真考虑重新设计您的游戏!如果您有大量组合在一起的复杂对象(如刚体网格碰撞器),则可能会发生这种情况,因此每一步都有许多多对多的碰撞。


    部分翻译:http ://answers.unity.com/answers/11002/view.html添加、插入、反思......

    • 14

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5