我已经创建了光线追踪器的基础,这是我绘制场景的测试函数:
public void Trace(int start, int jump, Sphere testSphere)
{
for (int x = start; x < scene.SceneWidth; x += jump)
{
for (int y = 0; y < scene.SceneHeight; y++)
{
Ray fired = Ray.FireThroughPixel(scene, x, y);
if (testSphere.Intersects(fired))
sceneRenderer.SetPixel(x, y, Color.Red);
else sceneRenderer.SetPixel(x, y, Color.Black);
}
}
}
SetPixel 只是在颜色的一维数组中设置一个值。如果我通过直接调用它来正常调用该函数,它会以恒定的 55fps 运行。如果我做:
Thread t1 = new Thread(() => Trace(0, 1, testSphere));
t1.Start();
t1.Join();
它以恒定的 50fps 运行,这很好并且可以理解,但是当我这样做时:
Thread t1 = new Thread(() => Trace(0, 2, testSphere));
Thread t2 = new Thread(() => Trace(1, 2, testSphere));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
它到处运行,在 30-40 fps 之间快速移动,有时会超出该范围,达到 50 或下降到 20,它根本不是恒定的。如果我在单个线程上运行整个事情,为什么它的运行速度比它慢?我在四核 i5 2500k 上运行。