1

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

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

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

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

// 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
    }
}
4

2 回答 2

1

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

我确定您将需要线程,但我不确定您是否需要自己显式管理它。让底层库来处理这个问题,并将工作推送到主 UI 线程/从主 UI 线程推送工作。

于 2012-11-08T13:53:09.857 回答
1

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

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

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

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

于 2012-11-08T13:48:48.173 回答