当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从一个协同例程到另一个协同例程的呼叫需要一个StartCoroutine吗?》经验,为你挑选了1个好方法。

当您有嵌套的协同例程时

void Update()
{
    if(someTest)
    {
        StartCoroutine(Foo());
    }
}

IEnumerator Foo()
{
    doStuff = true;
    yield return StartCoroutine(Bar());
    doStuff = false;
}

IEnumerator Bar()
{
    //Very important things!
}

StartCoroutineyield return StartCoroutine(Bar());有必要吗?

我们是否允许这样做

void Update()
{
    if(someTest)
    {
        StartCoroutine(Foo());
    }
}

IEnumerator Foo()
{
    doStuff = true;
    yield return Bar();
    doStuff = false;
}

IEnumerator Bar()
{
    //Very important things!
}

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



1> Programmer..:

收益率中的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().

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有