关于在Windows窗体中实现渲染循环的几个问题

时间:2014-10-25 13:24:37

标签: c# gdi+ game-engine message-queue

Guten Tag zusammen!(德语:大家好日子!

请原谅我的英语,这不是我的母语。由于我已经在这里找到了很多很好的答案,我现在想问你一些。

在过去的几天里,我对“在Windows窗体中实现游戏循环的最佳方式是什么?”进行了一些研究。我在SlimDX team找到了一个很好的解释解决方案,它基于Tom Miller的工作。

我的问题是:

首先:我使用此解决方案进行游戏循环,这是在渲染帧后重绘From的最佳方法吗?我经常发现的一种方法是调用 Invalidete(),但这对我来说不是一个好主意。这不会在消息队列中添加消息并且每帧都会中断while循环吗?

第二:据我所知,这个循环将消耗整个CPU-Thread(Core)。有没有好的方法可以将它降低到不消耗整个CPU-Thread的推荐帧速率?

第三: GDI +是否能够呈现简单的2D游戏?当Drawing变得如此复杂以至于建议使用硬件加速绘图时,某些DirectX或OpenGL包装器是什么?

1 个答案:

答案 0 :(得分:1)

  

我经常发现的一种方式是致电Invalidate(),但这对我来说并不是一个好主意。这不会在消息队列中添加消息并且每帧都会中断while循环吗?

是的,这是一个坏主意。您无法控制将消息传递到窗口的频率,这意味着您不应该依赖它。

  

据我所知,这个循环将占用整个CPU-Thread(Core)。有没有好的方法可以将它降低到不消耗整个CPU-Thread的推荐帧速率?

您可以使用SpinWait structure Thread.SpinWait)等待很短时间。将等待时间基于当前帧的持续时间和所需的帧速率。

但通常整个核心的游戏循环不是问题。如果你想最大化你的帧率,甚至可能需要它。

  

GDI +是否能够呈现简单的2D游戏?

是的,虽然它是一款非常简单的游戏。 GDI 。我建议你从一开始就使用硬件加速的解决方案,这样如果GDI被证明是瓶颈,你就不必重写所有内容。