当您有嵌套的协同例程时
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());
有必要吗?
我们是否允许这样做
void Update() { if(someTest) { StartCoroutine(Foo()); } } IEnumerator Foo() { doStuff = true; yield return Bar(); doStuff = false; } IEnumerator Bar() { //Very important things! }
如果我们被允许,这是否会对程序行为/性能产生任何影响?
收益率中的StartCoroutine是否返回StartCoroutine(Bar()); 必要?
不,你被允许使用yield return Bar();
.
如果我们被允许,这是否会对程序行为/性能产生任何影响?
对行为和性能问题都是肯定的.
差异:
yield return StartCoroutine(coroutineFunction())
:
内部coroutine(Bar
)将在屈服之前启动
内存分配:56个字节
电话:2
当一个父协程被杀死时,启动的子协程StartCoroutine
继续运行.
yield return coroutineFunction()
:
内部coroutine(Bar
)将在屈服后开始
内存分配:32个字节
电话:3
当一个父协程被杀死时,启动的子协程也会yield return coroutineFunction()
被杀死.这一点非常重要,特别是当您需要停止父子协同程序及其子项时.
更快:
可能是因为它分配的内存较少.在for
循环中使用它比它更快yield return StartCoroutine(coroutineFunction())
.即使它有更多的呼叫,这甚至是正确的.此外,Profiler中的Time和
Self ms显示其值小于来自的值yield return StartCoroutine(coroutineFunction())
.
总之:
该yielding
差异是几乎像i++
VS ++i
(后和前增量).如果您关心内存管理,那么请使用第二种方法,yield return coroutineFunction()
因为它分配的内存较少.此外,如果您希望能够在父节点停止时停止所有内部或子协同程序,那么也可以使用yield return coroutineFunction()
.