5

我目前正在编写一个简单的游戏。我的图形代码每帧运行一次(大约每秒 30 次),并将 RGB 数据写入具有 640 * 480 = 307200 个条目的数组。

我创建了一个 Win32 窗口,其客户区的大小正好为 640 x 480 像素。在原本为空的窗口中显示我的 RGB 数据的最快方法是什么?

窗口需要每帧更新,所以我需要避免闪烁。我应该为此使用 GDI 吗?或者是否有更快的方法使用不同的库——比如 DirectDraw?

编辑:

感谢所有的答复。首先,让我排除 Direct2D 作为选项 - 我需要支持 Windows XP。其次,我有 3D 背景,所以 Yann Ramin 和 Ben Voigtto 建议的方法 - 使用 Direct3D/OpenGL 和单个纹理四边形 - 是我过去一直这样做的方法。

但是,我很想知道 2D API 是否会是更好的解决方案。由于没有明确的答案,我整理了一个测试程序。该代码只是尽可能快地在屏幕上重复显示一个帧缓冲区。

我已经发布了我的结果作为这个后续问题的一部分。

4

4 回答 4

3

使用 GDI 可以做的最好的事情是SetDIBitsToDevice直接将 RGB 数据从阵列复制到窗口。当然,如果您需要完全消除闪烁,DirectX 是不二之选。

于 2010-11-08T01:01:21.020 回答
1

GDI绝对不是要走的路。

最好的跨窗口版本方法是使用 Direct3D,并且只需在单个全屏四边形上更新纹理。

Direct2D 是一种新的 API(Win Vista with Service Pack 及以上),如果您不需要支持 XP,它是首选机制。Direct2d 以加速的方式处理字体和其他系统级任务。

于 2010-11-08T00:57:42.050 回答
1

GDI 功能SetDIBitsToDevice可以正常工作。

按照 theatrus 的建议对四边形进行纹理化也可以,但它不必是全屏的,而 OpenGL 是迄今为止最便携的选项,要实现这一点,请参阅glTexSubImage2D

更直接的方法是glDrawPixels

不过,理想情况下,您的图形代码将使用 GPU 加速渲染直接到 GPU 内存中,然后您就不必担心将位从系统内存移动到 GPU 中。

于 2010-11-08T01:02:43.703 回答
1

使用 DirectDraw。我有一个全屏的生命游戏,当我使用 GDI 时,它在像素绘图上遇到了瓶颈,在我切换到 DirectDraw 之后,我开始轻松地抽出 60 fps。

于 2010-11-08T01:04:29.223 回答