gpt4 book ai didi

c# - 在 Unity 中,我什么时候应该使用协程而不是在 Update() 中减去 Time.deltaTime?

转载 作者:行者123 更新时间:2023-12-03 13:56:53 24 4
gpt4 key购买 nike

下面是我想强调的差异的一个简单示例。

使用协程:

public float repeatRate = 5f;
void Start()
{
StartCoroutine("RepeatSomething");
}
IEnumerator RepeatSomething()
{
while (true)
{
yield return new WaitForSeconds(repeatRate);
// Do something
}
}

使用 Update()Time.deltaTime :
public float repeatRate = 5f;
private float timer = 0;
void Update()
{
if (timer < 0)
{
// Do something
timer = repeatRate;
}
timer -= Time.deltaTime;
}

我什么时候应该使用一个而不是另一个,每个的优点/缺点是什么?

最佳答案

在大多数情况下,答案是。

一般来说,更新和协程之间的性能差异是不相关的。只需遵循最适合您的方法,但使用性能更高的 MEC Coroutines而不是 Unity Coroutine如果你想遵循类似协程的方法。

  • MEC Coroutine performance analysis .
  • Unity Coroutine performance analysis .

  • 使用简单

    unity forum 中所述一般来说,“ Coroutines 对于在多个帧上执行方法非常有用[然后忘记它]。”

    如果您打算只使用其中的几个(少于 10k?),那么您也可以使用 Unity Coroutines .

    高级用法

    目前Unity支持 Task/Async ,但性能仍然很低。所以你可能会考虑使用 Coroutines模拟 Async功能。

    在这种情况下,您甚至可以使用 Coroutines删除所有(或大部分)您的 Update循环,例如在您发布的示例中。

    这在性能方面很有用,尤其是在您的特定情况下,因为当您使用 Update 时循环你不断检查 if (timer < 0)即使你什么都不做。即使是空的更新循环仍然是一个性能问题。

    另一方面,您可能只是开始和停止 Coroutines当一个事件发生时。当 Coroutine 停止时,性能成本变为 0。

    如果您想遵循此方法,我强烈建议您使用 MEC coroutines消除了由 Unity 协程引起的所有性能问题(并具有相同的功能)。

    综上所述
  • 在大多数情况下,这种性能差异无关紧要
  • MEC Coroutines比更新循环的性能要好一点
  • Update循环通常比 Unity Coroutines 性能更高
  • Unity Coroutines应该仅用于很少发生的简单定时任务

  • PS: this answer关于统一协程可能会帮助您深入了解它们的工作方式。
    缴费灵: this old answer可能会让您有更深入的了解,但它有点过时了,尤其是在谈到垃圾收集时。

    关于c# - 在 Unity 中,我什么时候应该使用协程而不是在 Update() 中减去 Time.deltaTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61464452/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com