Unity Performance - Coroutines vs FSM on update

时间:2013-02-01 06:17:56

标签: unity3d coroutine state-machine fsm

我刚刚开始研究Unity脚本,我很难理解为什么有些人更喜欢coroutines而不是状态机。

我确实理解代码可能对某些程序员来说更具可读性,但我无法理解为什么有些人会说使用协同程序更适合性能。

我在Unity中使用C#,从我理解C# compiler converts the IEnumerator into a state machine

所以也许我在这里遗漏了一些东西。运行时性能是否更好地使用Coroutines而不是FSM循环来处理行为和状态?如果是,为什么?

3 个答案:

答案 0 :(得分:5)

在某些情况下使用协程会更快,因为您可以方便地安排Unity以特定间隔执行操作,而不是每帧都执行操作,从而节省处理时间。这真的是节省时间的调度,而不是协同程序。

从Unity文档中获取您突出显示的示例(在其他答案的评论中),其中显示:

  

使用协同程序。 Update调用的问题是它们每帧都会发生。很可能每隔5秒就可以检查到玩家的距离。这样可以节省大量处理能力。

这就是说使用WaitForSeconds( 5f )的协程会比每帧检查距离更快。这并不意味着这样做必然比拥有自己的Update逻辑更快,该逻辑仅每五秒检查一次距离。

话虽如此,如果协程方法仍然比基于Update的检查 - 每隔五秒钟逻辑更快(尽管不那么显着),我也不会感到惊讶,因为你仍然可以保存检查游戏代码中每一帧的当前帧时间。是的,在Unity的引擎循环中的某个地方,这次检查仍在进行,并用于确定是否要进入下一个协程步骤,但它可能已经过高度优化而且无论如何都会发生,所以协程不会增加额外的时间来检查逻辑作为基于Update的方法。

顺便说一句,有关Unity如何实现协同程序的详细介绍,请参阅此blog post

答案 1 :(得分:2)

你必须小心你正在使用协同程序。它们非常适合您不想挂起游戏的长期运营。

但是你必须非常小心你在协程中产生的频率。每次你屈服,coroutine恢复需要一些时间(多个帧)。如果产量过高,那么你的协程处理速度会比它需要的慢。例如,我正在研究寻路系统。在运行寻路算法时,我正在使用协程定期收益。这导致路径查找代码花费的时间比应有的长。我发现在Update中执行此操作要快得多。

协同程序非常适合执行长期运行的异步任务,例如Web请求,或者在后台下载某些内容等。我不知道我会建议在主游戏处理循环中使用协同程序。 (特别是输入)

答案 2 :(得分:1)

我认为没有一个普遍的答案。这在很大程度上取决于你在代码中做了什么。写得很糟糕的Coroutine可能比编写良好的FSM慢,反之亦然。我会说你的代码的可读性和可理解性总是胜过潜在的(并且在这种状态下无形的)性能提升。如果遇到特定性能问题,请在遇到它时解决。因此,我建议您使用对您和您的团队最直观的方法。