Sco*_*ain 5 c# coroutine unity-game-engine
当您有嵌套的协同例程时
void Update()
{
if(someTest)
{
StartCoroutine(Foo());
}
}
IEnumerator Foo()
{
doStuff = true;
yield return StartCoroutine(Bar());
doStuff = false;
}
IEnumerator Bar()
{
//Very important things!
}
Run Code Online (Sandbox Code Playgroud)
是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!
}
Run Code Online (Sandbox Code Playgroud)
如果我们被允许,这是否会对程序行为/性能产生任何影响?
收益率中的StartCoroutine是否返回StartCoroutine(Bar()); 必要?
不,你被允许使用yield return Bar();.
如果我们被允许,这是否会对程序行为/性能产生任何影响?
对行为和性能问题都是肯定的.
差异:
yield return StartCoroutine(coroutineFunction()):
Bar)将在屈服之前启动StartCoroutine继续运行.yield return coroutineFunction():
Bar)将在屈服后开始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().
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |