【发布时间】:2012-11-08 13:31:46
【问题描述】:
我正在使用 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
}
}
【问题讨论】:
-
我没有任何实际的游戏编程经验,但我的直觉是,将更新“推送”到渲染而不是轮询它可能会更好。我的意思是,如果有变化,你能通知 UI 并让它采取相应的行动吗?因此,当屏幕上没有任何变化并且用户处于空闲状态时,您不会浪费 CPU 周期。也许这不是一个好主意,正如我所说,没有经验,只是一个提示。
-
在我看来,您在这里有 三个 线程:GameLoop 线程、RenderLoop 线程和产生其他两个线程的 主线程。 .
-
@Davio:大多数 3Dish 游戏必须在发生任何变化时推送整个场景。 (无论如何,OpenGL 和 Direct3D API 都是这样做的。)如果场景中有任何东西发生变化,则需要重新显示整个东西。
-
如果您的
while(true)中没有任何限制,每个线程将以 100% 的 CPU 负载运行,这可能会减慢您将来需要的其他线程(例如 KI)以及整个系统没有做任何有意义的事情。 -
哦,是的@cHao,你说得对,我有三个线程:-)
标签: c# multithreading gdi+ game-loop