System.Drawing足够快的2D游戏编程?

时间:2012-02-25 11:14:34

标签: c# graphics .net-4.0 gdi+ system.drawing

假设我在C#中使用System.Drawing制作基于2D Tile的游戏。

GDI的OOP层?

System.Drawing命名空间提供对GDI +基本图形功能的访问。 ~MSDN

当我开始使用Graphics&在C语言中的游戏编程,很多书籍如this一本教我,像GDI这样的软件渲染API对于运行在体面FPS上的双缓冲2D游戏来说效率不高。那么Microsoft .NET的System.Drawing实现属于同一类别吗?它是否使用GDI&引擎盖下的GDI +,还是可以使用不同的,更快的后端?

我希望有多少FPS?

即使System.Drawing只能使用GDI,也不可能让游戏以合适的帧速率运行,比如每秒50-60帧,使用GDI?

2 个答案:

答案 0 :(得分:3)

它不是一个足够快的问题,因为它适合你想要执行的任务。老实说,实现基本功能很容易进行XNA所需的绘图,而且你可以免费获得这么多。没有理由进入System.Drawing制作游戏。

你链接的书非常古老,虽然它包含一些永不过时的算法,但大多数算法都已经过时了。

至于你可以从System.Drawing获得多少FPS,你可以从简单的基于平铺的游戏中获得足够的FPS。如果你这样做会开始工作,但它会妨碍你以后取得真正的进展 - 特别是因为这些天使用XNA制作游戏的门槛很低。

答案 1 :(得分:1)

你会得到什么样的FPS是非常不可思议的,这完全取决于你的场景是多么复杂。 GDI / +渲染的最大限制是位图存储在主存储器中,而不是存储在视频适配器存储器中。因此,您绘制的大多数内容都必须从RAM复制到视频适配器的帧缓冲区。当然,只要您不采用可以管理视频适配器内存的API,这是相对缓慢但不可避免的。避免使用这种API的原因很少,没有任何硬件不支持DirectX。

相当于页面翻转很容易获得,只需将表单或控件的DoubleBuffered属性设置为true即可。您绘制的任何内容都会首先进入后台缓冲区,在Paint事件完成后,该缓冲区将对视频适配器进行blitting。你唯一不会得到的是与适配器的垂直刷新间隔同步,因此撕裂是不可避免的。多大程度上取决于你在场景中移动物体的速度有多大。

唯一的其他细节是您绘制的任何位图的像素格式。精灵,纹理,那种东西。您选择的格式非常重要。在当前的硬件上,Format32bppPArgb比其他任何硬件快十倍。如果对位图进行任何重新缩放,则Graphics.InterpolationMode属性对速度很重要。好的很贵。只要确保只有一个线程同时访问位图,就可以在工作线程中重新缩放它们。

但请务必查看DirectX(例如SlimDX)和XNA。为方便起见难以击败,只需要做很多工作。