多线程迭代密集型工作

时间:2014-08-19 19:10:23

标签: c# multithreading loops 3d

我创造了一个载有大量小行星的游戏。为了适应严重的碰撞检测,我将世界分成了#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;
}

0 个答案:

没有答案