Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行生成数组的简单方法_C#_Unity3d_Coroutine - Fatal编程技术网

C# 并行生成数组的简单方法

C# 并行生成数组的简单方法,c#,unity3d,coroutine,C#,Unity3d,Coroutine,较新版本的C#具有async/wait。但在统一中只有收益如何实现一种方法,在这种方法中,我可以并行地产生? 与Javascript中的Promise.all([])类似,我们不关心哪一个先完成,我们只关心它们何时完成 为了提供更多的上下文,假设您正在设计一个程序性地形生成器,该生成器以块的形式生成;您已经使用ThreadPool设置要生成的每个块,然后提供一个返回IEnumerator的API: IEnumerator GenerateChunk() { // procedural gen

较新版本的C#具有
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()也会自动执行
可能仍在运行。我多次阅读了您的最后两条评论,但仍然不明白您想说什么……请参见