【问题标题】:Is coroutine the right way to go, when waiting for other functions to complete?在等待其他功能完成时,协程是正确的方法吗?
【发布时间】:2016-06-02 17:43:24
【问题描述】:

试图弄清楚协程是否是正确的方法。

我有 3 个不同的类来执行操作;我希望这 3 个类按任意顺序完成它们的工作,一旦全部完成 3 个,我就可以进入下一个循环并再次调用这 3 个类中的方法以重新开始。

现在,我在每个类中都有一个方法来完成这项工作;在主类中,我创建了一个协程,这是我的程序的主循环。 协程的条件是 3 个类中的所有 3 个方法都必须在一个产生返回 void 的 while 循环中完成。这是协程的简化版本:

IEnumerator void loopFunction()
{
    while (!classA.method() && !classB.method() && !classC.method())
    {
        yeld return void;
    }
    // do some updates
    // start all over again
}

这会正确实施还是我应该使用不同的方法?目标是有一个每 X 秒执行一次的循环,并且只有在其中的所有方法都完成时才开始一个新的循环。

编辑:

在浏览时我发现实际上可以使用多线程,即旧的“System.Threading”方式,因为 Unity 仅支持 Net 3.5。

线程似乎是另一个可行的选择;虽然我听说 Unity 本身不是线程安全的,所以我不确定您是否可以将协程内部不同类中的函数作为单独的线程运行。

【问题讨论】:

  • 这些循环是否以任何方式直接与 Unity 交互?
  • 每个函数只是在后台计算值; AI 在主循环中的 FSM 中运行,以避免任何形式的灾难性锁定。一类是控制器,它更新视图(主 UI);这会被视为直接互动吗?我正在使用新的 GUI (4.6+)

标签: c# unity3d coroutine


【解决方案1】:

这取决于这些方法将如何与您的游戏的其余部分进行交互。协程提供了一种并发形式,而线程提供了一种并行形式。

仅当您确实需要并行化操作时才使用线程,因为其余的协程都很好。

协程只是提供了一种机制来组合独立执行的代码块,其中该执行是交错的,而不是并行的。协程和任何其他通用方法/函数之间基本上没有区别,除了它能够(轻松地)暂停执行一段时间。

简单地说,协程是关于结构的,线程是关于执行的。如果您只是想将一组操作分散到多个帧中,那么协程提供了一种很好的方法来做到这一点。协程在主线程上执行,因此只要您的三个方法正在运行,游戏的其他部分就会暂停 - 您的代码控制着“暂停”操作。

如果您的应用在可以并行化操作(多核或多处理器)的硬件平台上运行,并且您希望利用这种潜力,那么请查看线程。或者,如果您使用 3rd 方库并且您无法控制特定操作需要多长时间(并且需要太长时间),那么您也可以考虑使用线程。显然这会带来一些额外的复杂性,请记住 Unity 不是线程安全的,因此如果您的操作以任何方式与 Unity API 交互,您需要注意您的方法通过某种锁适当地同步。不要直接从另一个线程访问 Unity 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2014-02-26
    • 2014-11-15
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多