Алексей Шиманский Asked:2022-04-20 17:53:15 +0800 CST2022-04-20 17:53:15 +0800 CST 2022-04-20 17:53:15 +0800 CST FixedUpdate 和 Update 有什么区别?他们什么时候叫? 772 我开始学习Unity3dUpdate() ,我不清楚的一件事是和之间的区别FixedUpdate()。 在我的项目中,我使用该方法Update()并且一切正常。FixedUpdate()方法和通常的有什么区别Update()? c# 1 个回答 Voted Best Answer Алексей Шиманский 2022-04-20T18:01:09+08:002022-04-20T18:01:09+08:00 简要说明: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添加、插入、反思......
简要说明:
Update
每帧调用一次,并且FixedUpdate
以固定速率调用,与 FPS 无关。在这种情况下,可以在Unity设置中更改频率。它的频率取决于计算机能够显示图像的速度。在速度较慢的计算机上调用它的频率
Update
低于在速度较快的计算机上调用的频率。如果您正在根据时间进行计算,您可以使用 标准化它们Time.deltaTime
,这将告诉您自上次调用 以来已经过去了多少时间Update
。它通常用于执行与显示相关的任务(例如更新 UI 元素)FixedUpdate
无论FPS如何,都以固定频率调用。在这种情况下,可以在Unity设置中更改频率。无论图像更新的频率如何,都称为固定。通常用于执行与游戏玩法相关的任务(例如,更新物理)。再来一点:
我将首先编写一些伪代码并在下面添加图表,这可能有助于您理解什么是什么。
下面的(完全虚构的)代码首先运行适当数量的物理步骤以“赶上”当前时间(并
FixedUpdate()
在每个步骤中实现它的每个对象上调用)。然后为框架绘制图形,然后Update()
是实现它的每个对象。如果游戏以低帧率运行,则在每个可见帧渲染之间会有大量物理更新。相反,如果游戏以非常高的帧速率运行,则在某些帧的渲染之间可能没有物理步骤,因为自上一帧渲染以来经过的时间尚未超过一个物理步骤的时间段。
Unity 可以设置每秒物理更新的次数。默认情况下,这是“0.02”,即 这大约是每秒 50 次物理更新(每个物理步骤模拟发生在百分之二秒以上的运动)。
因此,对于初学者来说,一个简单的图表显示了十分之一秒的周期。分隔线的点代表百分之一秒。“F”表示方法调用的相等划分
FixedUpdate
现在,如果我们的游戏以 100 fps 的速度运行得又快又好,我们将为每个物理步骤提供两个帧渲染,因此
Update
每个函数调用都有两个函数调用。FixedUpdate
(“F”代表挑战
FixedUpdate
,“U”代表Update
)如果我们的游戏运行速度较慢,比如 30 fps(因此
Update
每秒 30 个所有函数调用),这意味着我们实际上有时在渲染每一帧之间有多个物理步骤。在每秒 30 帧的情况下,结果将是有时帧之间有两个物理步骤,有时一个,看起来像这样,在前 10 秒内:因此,在大多数正常情况下,您将始终获得每帧所需且恒定的物理步数,并且它们将尽可能快地交错视觉帧更新。
出于这个原因
FixedUpdate
,它应该在对物体使用力(Force)、扭矩或其他与物理相关的函数时使用,因为您知道它将与物理引擎本身完全同步地执行。虽然它
Update
可能与物理引擎不同,更快或更慢,具体取决于图形在当前时间对渲染引擎施加什么样的负载(使用这种物理方法会产生非常量和不正确的工作)例外情况是,如果您的场景对物理引擎施加了如此大的负载,以至于它会接近无法完成所需数量的物理时间步以跟上“实时”的程度。这意味着您的游戏已经无法实时模拟,在这种情况下,您需要认真考虑重新设计您的游戏!如果您有大量组合在一起的复杂对象(如刚体网格碰撞器),则可能会发生这种情况,因此每一步都有许多多对多的碰撞。
部分翻译:http ://answers.unity.com/answers/11002/view.html添加、插入、反思......