C# 并行生成数组的简单方法
较新版本的C#具有C# 并行生成数组的简单方法,c#,unity3d,coroutine,C#,Unity3d,Coroutine,较新版本的C#具有async/wait。但在统一中只有收益如何实现一种方法,在这种方法中,我可以并行地产生? 与Javascript中的Promise.all([])类似,我们不关心哪一个先完成,我们只关心它们何时完成 为了提供更多的上下文,假设您正在设计一个程序性地形生成器,该生成器以块的形式生成;您已经使用ThreadPool设置要生成的每个块,然后提供一个返回IEnumerator的API: IEnumerator GenerateChunk() { // procedural gen
async
/wait
。但在统一中只有收益如何实现一种方法,在这种方法中,我可以并行地产生?
与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());
}
IEnumerator GenerateChunk(){
//程序生成
//将自身排队到线程池中
//当完成时,屈服
}
IEnumerator GenerateChunks(){
for(int i=0;i
我们可以做一些类似于生成IEnumerator[]
的事情吗
更新:我不确定自己表达得是否清楚。基本上,我想一次启动所有GenerateChunk
,让它们尽可能快地完成,而不是一个接一个地让步
我的代码已经在这样做了,或者我还需要什么吗?我读了你的问题,读了你留下的答案和评论,我相信你确实不理解协同程序是如何工作的
yield return StartCoroutine(chunks[i].GenerateChunk());
协同程序不是并行运行的。它将按顺序同时在同一线程中运行代码
更新:我不确定自己表达得是否清楚。基本上我想一次启动所有GenerateChunk,让它们完成
尽可能快,而不是一个接一个地屈服
我的代码已经在这样做了,还是我还需要其他什么
yield return StartCoroutine(chunks[i].GenerateChunk());
否。如果您想尽快调用该函数,则不应在每个函数之后产生。每次您屈服
,您都在等待一帧。我有没有提到您甚至没有正确调用GenerateChunk
函数?仔细看,你也会注意到这一点GenerateChunk
函数是一个协同例程函数,必须使用startcroutine()
调用
在for循环中启动GenerateChunk
后,不要屈服。您应该只在for循环函数之外让步或中断。您可以在您的代码和下面的代码之间运行一个简单的性能测试,以验证这一点
IEnumerator GenerateChunk()
{
//程序生成
//将自身排队到线程池中
//当完成时,屈服
}
IEnumerator GenerateChunks()
{
for(int i=0;i
这仍然会按顺序生成,我已经测试过了。正确的答案可能是Enumerable.Concat()
TL;博士:忽略以上所有,我的问题是。我很抱歉在开始的时候没有说清楚。我只是想澄清一下,我知道它们是在同一个线程中运行的,我也知道收益链是如何工作的。通过并行,我的意思是以不确定的顺序解析。另外,GenerateChunk
返回一个IEnumerator
,我可以生成它,它最终将冒泡到GenerateMap
中的主start例程
。我认为您不需要再次包装它。虽然我在Unity协同程序方面不是专家,但我认为如果您不产生return startcroutine()
,它将自行执行,即即使GenerateChunks
完成,一些GenerateChunk()也会自动执行
可能仍在运行。我多次阅读了您的最后两条评论,但仍然不明白您想说什么……请参见