使用数组中的RGB数据重复填充窗口的最快方法是什么?

时间:2010-11-08 00:47:11

标签: winapi gdi rgb directdraw

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

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

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

修改

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

但是,我有兴趣了解2D API是否是更好的解决方案。由于没有明确的答案,我把测试程序汇总在一起。代码只是在屏幕上反复显示帧缓冲,尽可能快。

我已将结果发布为this follow-up question的一部分。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

绝对不是GDI。

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

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

答案 2 :(得分:1)

GDI函数SetDIBitsToDevice可以正常工作。

按照theatrus的建议对四边形进行纹理处理也是有效的,除了它不必是全屏的,OpenGL是迄今为止最便携的选项,为了实现这一点,请参阅glTexSubImage2D

更直接的方法是 glDrawPixels

理想情况下,您的图形代码会直接在GPU内存中使用GPU加速渲染,因此您无需担心将位从系统内存移动到GPU中。

答案 3 :(得分:1)

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