如何以最快的速度从数组中重复填充RGB数据到窗口?

6
我正在编写一个简单的游戏。我的图形代码每帧运行一次(大约每秒30次),并将RGB数据写入一个具有640 * 480 = 307200个条目的数组中。
我创建了一个大小为640 x 480像素的客户区域为640 x 480像素的Win32窗口。怎样才能最快地在空白窗口内显示我的RGB数据?
窗口需要每帧更新,因此我需要避免闪烁。我应该使用GDI吗?还是可以使用不同库(例如DirectDraw)更快的方法?
编辑:
感谢所有回复。首先,让我排除Direct2D作为选择 - 我需要支持Windows XP。其次,由于我有3D背景,所以Yann Ramin和Ben Voigtto建议的方法 - 使用Direct3D/OpenGL和单个纹理四边形 - 是我过去一直采用的方法。
但是,我很想知道2D API是否是更好的解决方案。由于没有确定的答案,我组织了一个测试程序。该代码仅以尽可能快的速度重复显示帧缓冲区。
我已经发布了我的结果,以便作为这个后续问题的一部分。
4个回答

4
你可以使用GDI中的SetDIBitsToDevice函数,将RGB数据直接从数组复制到窗口。当然,如果你需要完全消除闪烁,那么使用DirectX是更好的选择。

жҲ‘и®ӨдёәSetDIBits并没жңүзӣҙжҺҘз»ҳеҲ¶еҲ°зӘ—еҸЈдёҠпјҢжҲ‘и®ӨдёәдҪ йңҖиҰҒеңЁд№ӢеҗҺдҪҝз”ЁBitBltгҖӮ - Ben Voigt
@Ben Voigt:糟糕,我是指 SetDIBitsToDevice - casablanca

2

GDI函数 SetDIBitsToDevice 可以正常使用。

theatrus建议的四边形纹理也可以实现,但它不必是全屏幕,OpenGL是最具可移植性的选项,要实现这一点,请参见 glTexSubImage2D

一个更直接的方法是glDrawPixels

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


0

GDI绝对不是正确的选择。

最好的跨Windows版本的方法是使用Direct3D,并简单地在一个全屏四边形上更新纹理。

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


4
“GDI绝对不是可行的方法” - 我很想了解您为什么这样说。根据我在https://dev59.com/E2855IYBdhLWcg3w0H53上得到的结果,GDI是最快的方法 - 它也是最容易编写的。 - user200783

0
使用DirectDraw。我有一个全屏的生命游戏,当我使用GDI进行像素绘制时,它受到了瓶颈的影响,但是在我切换到DirectDraw之后,我轻松地输出了60 fps。

DirectDraw已经被弃用。虽然API仍然存在,但它已经不再得到支持。 - Yann Ramin
有趣的是,在我的测试中(https://dev59.com/E2855IYBdhLWcg3w0H53),DirectDraw 比 GDI 更慢。你使用了与我不同的方法来使用这两个 API 吗? - user200783
请注意,我提到的是setpixel调用而不是位块传输。我很惊讶看到2K fps。你确定这些调用没有被短路了吗? - DennyRolling
再仔细看,我觉得有些调用可能确实被短路了... - user200783

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接