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

C# 关于在Windows窗体中实现渲染循环的几个问题,c#,gdi+,game-engine,message-queue,C#,Gdi+,Game Engine,Message Queue,古滕塔格祖萨曼(德语:大家好!) 请原谅我的英语,它不是我的母语。既然我在这里已经找到了很多很好的答案,我现在想问你一些问题 在过去的几天里,我对“在Windows窗体中实现游戏循环的最佳方式是什么”这个问题做了一些研究。我从表格中找到了一个很好的解释解决方案,它是基于 我的问题是: 首先:我将此解决方案用于游戏循环,这是在渲染帧后重新绘制的最佳方法?我经常发现的一种方法是调用invalidate(),但这对我来说不是个好主意。这会不会在消息队列中添加一条消息,并在每一帧中断while循环 Se

古滕塔格祖萨曼(德语:大家好!)

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

在过去的几天里,我对“在Windows窗体中实现游戏循环的最佳方式是什么”这个问题做了一些研究。我从表格中找到了一个很好的解释解决方案,它是基于

我的问题是:


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

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

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


我经常发现的一种方法是调用
Invalidate()
,但我觉得这不是个好主意。这会不会在消息队列中添加一条消息,并在每一帧中断while循环

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

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

您可以使用()短时间等待。根据当前帧的持续时间和所需的帧速率确定等待时间

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

GDI+能够渲染一个简单的2D游戏吗


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

感谢您的快速回答。当我不应该使用Invalidate()重新绘制表单时。我该怎么做呢?链接的SlimDX文章对此进行了很好的解释,我对此解释得再好不过了。“这不是会在消息队列中添加一条消息,并在每帧中断while循环吗?”这个问题的正确答案是否定的。窗口失效的处理方式与其他窗口消息不同;窗口的无效部分只是标记窗口,然后当程序获取下一条消息时,Windows合成WM_PAINT消息。没有WM_PAINT消息实际出现在消息队列中。这就是说,WM_PAINT只在没有其他消息需要处理时返回,因此对于高帧速率游戏来说并不理想。但它不会填满消息队列。这是三个不同的技术问题,但SO格式只允许每个问题一个。所以,你最好把你的第二点和第三点编辑出来,作为独立的问题发布。你打破了游戏规则中的所有规则。不要使用Invalidate(),使用CreateGraphics()直接绘制到屏幕上。燃烧核心是可以的,通常由垂直刷新来调整,但在非DirectX代码中很难做到这一点。系统。绘图适合2D游戏,请确保缓存位图并注意像素格式(32bppPArgb快10倍),GPU渲染需要完全不同的代码。为什么不使用XNA而不用担心所有这些事情?微软已经停止支持它,但它仍然是一个可行的选择。当然,它将比GDI更高效(特别是对于游戏而言)。