我创造了一个载有大量小行星的游戏。为了适应严重的碰撞检测,我将世界分成了#34; AsteroidChunks"其中只有最近的块用于碰撞检测。将小行星分割成块的工作非常重复,每次游戏启动时都会进行12亿次迭代。但是,我注意到游戏实际上并没有使用那么多的CPU能力。没有一个核心以100%运行! (该游戏基于MonoGame for Windows)
我的想法是,通过在多个线程上运行最多次重复的东西(类似于让每个线程完成1000次迭代),我可以更快地完成工作,当然是以CPU功耗为代价。我是在正确的轨道上,我该怎么办?
有没有其他方法可以加速迭代,从而可以获得更大的3D空间?
这是我迄今为止所尝试过的。它不起作用,但会让我知道我想要完成的任务:(asteroidChunks
是一个List
,约有16,000个条目,但很容易就是> 100,000))
Task[] populateChunkTasks = new Task[asteroidChunks.Count];
for (int i = 0; i < asteroidChunks.Count; i += 1000)
populateChunkTasks[i] = new Task(() =>
{
for (int x = i; x < asteroidChunks.Count && x < i + 1000; x++)
PopulateChunk(asteroidChunks[x]);
});
for (int i = 0; i < populateChunkTasks.Length; i++)
populateChunkTasks[i].Start();
Task.WaitAll(populateChunkTasks);
正如您所看到的,我想等待线程在最后完成。但是,操作本身就是它自己的Task
,这就是为什么我不能等待所有任务 - 在这种情况下 - 在继续之前完成。
PopulateChunk
:( asteroidList
是一个包含大约75,000个条目的列表,但很容易就是> 1百万)
public static AsteroidChunk PopulateChunk(AsteroidChunk chunk)
{
foreach (Asteroid asteroid in asteroidList)
if (chunk.box.Contains(asteroid.boundingSphere) == ContainmentType.Contains)
chunk.asteroids.Add(asteroid);
return chunk;
}