2016-09-22 49 views
1

较新的版本以产生阵列具有async/await。但在Unity中只有yield如何实现可以并行排列yield的方法?简单方式在C#平行

类似于Javascript中的Promise.all([]),我们不关心哪一个先完成,我们只关心它们什么时候完成。

为了给出更多的上下文,假设你正在设计一个程序性地形生成器,它生成大块;你已经设置每个块生成使用ThreadPool,然后提供一个返回IEnumerator的API:

IEnumerator GenerateChunk() { 
    // procedural generation 
    // queue itself onto a ThreadPool 
    // when done, yield 
} 

IEnumerator GenerateChunks() { 
    for (int i = 0; i < chunks.Length; i++) { 
    yield return chunks[i].GenerateChunk(); 
    } 
} 

void GenerateMap() { 
    StartCoroutine(GenerateChunks()); 
} 

我们可以这样做yield IEnumerator[]

更新:我不知道我说清楚了我。基本上我想立刻开始所有的GenerateChunk,并让他们尽快完成,而不是一个接一个地让步。

是我的代码已经这样做,或者我需要什么?

+0

正确的答案可能是'Enumerable.Concat()'http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable – bitinn

+0

** TL; DR:以上所有忽略,我的问题是[更好地在这里总结](http://forum.unity3d.com/threads/difference-between-yield-return-ienumerator-and-yield-return-startcoroutine.432571/)。我很抱歉没有在一开始就明确这一点。** – bitinn

回答

1
yield return StartCoroutine(chunks[i].GenerateChunk()); 
+0

这仍然会产生顺序,我已经测试它是肯定的。 – bitinn

1

我看了你的问题,阅读的答案,你离开的意见,我相信你做了解如何协同程序的工作。

协程不并行运行。它将按照相同的Thread顺序运行您的代码。

更新:我不知道我说清楚了我。基本上,我想踢启动所有GenerateChunk一次,并允许他们以最快的速度完成 越好,而不是产生了一个又一个。

我的代码已经这样做了,还是我需要其他东西?

。如果您想要像位置那样快地调用该功能,则在每个功能之后都不应该有yield。每次你yield,你都在等待一帧。我甚至提到你甚至没有正确调用GenerateChunk函数吗?仔细看,你也会注意到。 GenerateChunk函数是一个协程函数,必须用StartCoroutine()调用。

执行不是在for循环中启动GenerateChunk后产量。你只应该在for循环函数之外产生或破坏。你可以在你的代码和下面的代码之间运行一个简单的性能测试,用Stopwatch进行验证。

IEnumerator GenerateChunk() 
{ 
    // procedural generation 
    // queue itself onto a ThreadPool 
    // when done, yield 
} 

IEnumerator GenerateChunks() 
{ 
    for (int i = 0; i < chunks.Length; i++) 
    { 
     StartCoroutine(GenerateChunk()); 
    } 
    yield break; 
    //Or yield return null; 
} 
+1

为了澄清,我确实知道他们运行在同一个线程中,而且我知道收益链是如何工作的。平行我的意思是“决心”以非确定性的顺序。 – bitinn

+0

另外'GenerateChunk'返回'IEnumerator',我可以让它产生它,它最终会冒泡到'GenerateMap'中主要的'StartCoroutine'。我不认为你需要重新包装它。 – bitinn

+0

尽管我不是Unity统一通信协议的专家,但我认为如果您不'yield return StartCoroutine()',它将自行执行,即。即使GenerateChunk完成,一些GenerateChunk()也可能仍在运行。 – bitinn