生成并行数组的简单方法
本文关键字:简单 方法 数组 并行 | 更新日期: 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;
}