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

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)

StartCoroutineyield 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)

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

Pro*_*mer 6

收益率中的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中的TimeSelf ms显示其值小于来自的值yield return StartCoroutine(coroutineFunction()).

总之:

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