2016-09-22 71 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