从一个协同例程内部到另一个协同例行程序的调用是否需要StartCoroutine



当您有类似的嵌套协同例程时

void Update()
{
if(someTest)
{
StartCoroutine(Foo());
}
}
IEnumerator Foo()
{
doStuff = true;
yield return StartCoroutine(Bar());
doStuff = false;
}
IEnumerator Bar()
{
//Very important things!
}

yield return StartCoroutine(Bar());中的StartCoroutine是否必要?

我们可以只做吗

void Update()
{
if(someTest)
{
StartCoroutine(Foo());
}
}
IEnumerator Foo()
{
doStuff = true;
yield return Bar();
doStuff = false;
}
IEnumerator Bar()
{
//Very important things!
}

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

是返回值StartCoroutine(Bar())中的StartCoroutline;必需的

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

如果我们被允许,这对程序有任何影响吗行为/表现?

对行为和性能问题都是

差异


yield return StartCoroutine(coroutineFunction()):

  • 内部协同程序(Bar)将在屈服前启动
  • 内存分配:56字节
  • 调用:2
  • 当父协同出游被杀死时以CCD_ 6启动的程序继续运行

yield return coroutineFunction():

  • 内部协同程序(Bar)将在屈服后启动
  • 内存分配:32字节
  • 调用:3
  • 当父协同出游被杀死时以CCD_ 9开始的细胞也被杀死。这一点非常重要,尤其是当你需要停止父母和孩子们一起出游
  • 更快

    可能是因为它分配的内存较少。在for循环中使用时它比CCD_ 11快。这甚至是真的,尽管它有更多的电话。此外,时间Profiler的Self-ms显示其值小于yield return StartCoroutine(coroutineFunction())的值。

结论

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

相关内容

最新更新