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

本文关键字:循环 几个问题 实现 Windows 窗体 | 更新日期: 2023-09-27 18:27:58

Guten Tag zusammen(德语:大家好!

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

在过去的几天里,我对"在Windows窗体中实现游戏循环的最佳方法是什么?"这个问题做了一些研究。我从SlimDX团队中找到了一个很好的解释性解决方案,它是基于Tom Miller的工作。

我的问题是:

第一:我们将此解决方案用于游戏循环,这是在渲染帧后重新绘制From的最佳方式?我经常发现的一种方法是调用Invalidete(),但这对我来说不是一个好主意。这不是在消息队列中添加一条消息并打破每帧的while循环吗?

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

第三:GDI+是否能够渲染一个简单的2D游戏?。绘图什么时候变得如此复杂,以至于建议使用带有DirectX或OpenGL包装的硬件加速绘图?

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

我经常发现的一种方法是调用Invalidate(),但这对我来说不是一个好主意。这不是在消息队列中添加一条消息,并打破每帧的while循环吗?

是的,这是个坏主意。你无法控制消息发送到你的窗口的频率,这意味着你不应该依赖它

据我所知,这个循环将消耗整个CPU线程(Core)。有没有一种好的方法可以将其降低到不消耗整个CPU线程的推荐帧速率?

您可以使用SpinWait结构(NOTThread.SpinWait)来短时间等待。等待时间基于当前帧的持续时间和所需的帧速率。

但通常情况下,占据整个核心的游戏循环并不是问题。如果你想最大化你的帧速率,这甚至可能是你想要的。

GDI+能够呈现一个简单的2D游戏吗?

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