生成并行数组的简单方法

本文关键字:简单 方法 数组 并行 | 更新日期: 2023-09-27 18:08:12

新版本的c#有async/await。但在Unity中只有yield我如何实现一个方法,我可以并行yield ?

与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[]那样做吗?

UPDATE:我不确定我是否表达清楚了。基本上,我想一次启动所有的GenerateChunk,并让它们尽可能快地完成,而不是一个接一个地放弃。

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

生成并行数组的简单方法

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

我看了你的问题,看了你的回答和你留下的评论,我相信你确实理解协程是如何工作的。

协程不能并行运行。它将按顺序同时在同一个Thread中运行您的代码。

UPDATE:我不确定我是否表达清楚了。基本上,我想一次启动所有generatecchunk,然后让它们完成越快越好,而不是一个接一个地让步。

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

没有

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

在for循环中启动GenerateChunk后, yield。您应该只在for循环函数之外yield或break。您可以在您的代码和下面的代码之间运行一个简单的性能测试,用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;
}