从一个协同例程到另一个协同例程的呼叫需要一个StartCoroutine吗?

时间:2017-01-18 17:59:26

标签: c# unity3d coroutine

当你有嵌套的协同程序,如

7

void Update() { if(someTest) { StartCoroutine(Foo()); } } IEnumerator Foo() { doStuff = true; yield return StartCoroutine(Bar()); doStuff = false; } IEnumerator Bar() { //Very important things! } 中的StartCoroutine是否必要?

我们是否可以做到

yield return StartCoroutine(Bar());

如果我们被允许,这是否会对程序行为/性能产生任何影响?

1 个答案:

答案 0 :(得分:6)

  

收益率中的StartCoroutine是否返回StartCoroutine(Bar());   必要?

,您可以使用yield return Bar();

  

如果我们被允许,这是否会对该计划产生任何影响   行为/性能?

行为和性能问题

差异

<强> yield return StartCoroutine(coroutineFunction())

  • 内部协程(Bar)将在产生之前启动
  • 内存分配:56个字节
  • 致电:2
  • 当一个父协同程序被杀死时,那个孩子的协程就是了 从StartCoroutine开始继续运行。

<强> yield return coroutineFunction()

  • 内部协程(Bar)将在屈服后启动
  • 内存分配:32字节
  • 致电:3
  • 当一个父协同程序被杀死时,那个孩子的协程就是了 从yield return coroutineFunction()开始也被杀死了。 这一点非常重要,特别是当您需要停止时 父母与他们的孩子协调。
  • 更快

    可能是因为它分配的内存较少。在for循环中使用时 它比yield return StartCoroutine(coroutineFunction())快。 即使它有更多的呼叫,这甚至是正确的。此外,时间和 来自Profiler的 Self ms 显示其值小于yield return StartCoroutine(coroutineFunction())中的值。

总结

yielding差异几乎与i++ vs ++i(帖子和预增量)相似。如果您关心内存管理,那么请使用第二种方法yield return coroutineFunction(),因为它分配的内存较少。此外,如果您希望能够在父节点停止时停止所有内部或子协同程序,那么也可以使用yield return coroutineFunction()