【问题标题】:Is a StartCoroutine needed for a call from inside one co-routine to another co-routine?从一个协程内部调用另一个协程是否需要 StartCoroutine?
【发布时间】:2017-06-03 05:44:51
【问题描述】:

当你有嵌套的协程,比如

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!
}

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

【问题讨论】:

  • 根据这个问题的最新答案(以及一些简短的测试),它们的结果相同:answers.unity3d.com/questions/724244/…
  • 如果您想引用 andymilsom 的答案并在此处发布,我会接受。
  • 它们与答案所说的不同。我会给出一个答案来解决这些差异。

标签: c# unity3d coroutine


【解决方案1】:

是yield中的StartCoroutine return StartCoroutine(Bar()); 有必要吗?

,你可以使用yield return Bar();

如果我们被允许,这会对程序有任何影响吗 行为/表现?

行为和性能问题。

区别


yield return StartCoroutine(coroutineFunction()):

  • 内部协程(Bar) 将在产生之前启动
  • 内存分配:56字节
  • 来电:2
  • 当父协程被杀死时,被杀死的子协程 以StartCoroutine 开始继续运行。

yield return coroutineFunction():

  • 内部协程(Bar) 将在产生后启动
  • 内存分配:32字节
  • 来电:3
  • 当父协程被杀死时,被杀死的子协程 以yield return coroutineFunction() 开头的也会被杀死。 这一点很重要,尤其是当您需要停止 父协程及其子协程。
  • 更快

    可能是因为它分配的内存较少。在for 循环中使用时 它比yield return StartCoroutine(coroutineFunction()) 快。 即使它有更多的调用也是如此。另外,时间和 来自 Profiler 的 Self ms 显示其值小于来自 yield return StartCoroutine(coroutineFunction()) 的值。

结论

yielding 的区别几乎就像 i++++i 的区别(前后增量)。如果您关心内存管理,请使用第二种方法yield return coroutineFunction(),因为它分配的内存更少。此外,如果您希望能够在父协程停止时停止所有内部或子协程,那么也可以使用yield return coroutineFunction()

【讨论】:

  • 谢谢,非常有用。程序员,您是为 Unity 工作还是知识渊博,我在 Unity 问题上经常看到您的名字。另外,您从哪里获得调用和内存分配的数字,您是否有我可以从中阅读更多信息的参考资料,或者您是否只是分析了两个测试用例并从中获得了数字?
  • 我不为 Unity 工作。我只是每天都使用 Unity,并且总是使用 .NET Reflector 研究它的内部内容。 This 是我的 test1 脚本,它分配了更多内存。 This 是我的 test2 脚本,它分配的内存更少。转到窗口-> 探查器。您将能够看到这些信息。我只花了大约一个小时来再次验证这个信息,因为我已经很久没有做这个实验了。该信息在最新的 Unity 版本中仍然有效。
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多