一个简单的C#游戏循环使用两个线程,这个好吗?

时间:2012-11-08 13:31:47

标签: c# multithreading gdi+ game-loop

我正在使用C#中的GDI +创建一个简单的游戏。

首先,我需要一个游戏循环和一个渲染循环。我决定将这些分成两个单独的线程。它似乎工作,运行速度非常快,但我在这里问的原因是因为我看到人们在他们的游戏循环中使用计时器使它们以特定的帧速率运行。

这显然具有优势,您可以确定演员移动的速度。但我的游戏循环只是尽可能快地运行,就像Unity3D中的Update功能一样。现在为了确保演员总是以相同的速度移动,我所要做的就是将移动速度乘以帧增量时间(每帧之间的时间)。

我的渲染循环也尽可能快地运行。这是一个很好的游戏循环,为什么或为什么不呢?

// Constructor
public FormDisplay()
{
    // Create a thread object, passing in the GameLoop method
    var gameThread = new Thread(this.GameLoop);

    // Start the game thread
    gameThread.Start();

    // Create a thread object, passing in the GameLoop method
    var renderThread = new Thread(this.RenderLoop);

    // Start the render thread
    renderThread.Start();
}

private void GameLoop()
{
    while (true)
    {
        // TODO: Insert Game Logic
    }
}

private void RenderLoop()
{
    while (true)
    {
        // TODO: Insert Render Logic
    }
}

2 个答案:

答案 0 :(得分:1)

您应该将屏幕刷新率视为限制因素。如果你的屏幕每秒只更新100次,那么每秒移动你的演员300次是毫无意义的。

同样,当监视器刷新率仅为100Hz时,将屏幕每秒渲染300次可能会显示撕裂。当缓冲区出现在​​屏幕上时更新帧缓冲区会发生这种情况,因此演员的上半部分显示在旧位置,底部显示在新位置。

关于减少闪烁的好文章是Stack Overflow问题 Reduce flicker with GDI+ and C++

理想情况下,作为一般游戏循环,您的游戏线程应该处理并构建一个列表以传递到渲染线程以进行下一次屏幕刷新(也就是说,您总是处理下一个显示的帧)。两个线程然后等待下一帧。这当然意味着您需要知道何时发生这种情况 - 我认为您无法使用GDI +找到渲染。

答案 1 :(得分:1)

直接管理自己的线程而不了解库自己如何(或.NET GUI)使用线程的想法似乎是一个坏主意。

我确定你需要线程,但我不确定你是否需要自己明确管理它。让底层库负责处理并将工作推送到主UI线程中。