当您有类似的嵌套协同例程时
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()
。