C++ GDI中的实时绘图

C++ GDI中的实时绘图,c++,winapi,graphics,bitmap,gdi,C++,Winapi,Graphics,Bitmap,Gdi,我目前正在编写一个3D渲染器(为了好玩和研究),所以我需要一种将帧缓冲区绘制到窗口的方法。因为我所有的计算都是在CPU上进行的,所以绘图需要尽可能快 我的目标之一是不使用现有的图形库(OpenGL/DirectX),因此屏幕上的图形是纯Win32的。在我的研究中,我发现了几种创建和绘制位图的方法,现在我正在寻找最好的方法 我当前的实现使用了一个使用CreateDIBSection()创建的位图,该位图使用BitBlt()绘制到我的窗口DC CreateDIBSection()。使用此方法,我实现

我目前正在编写一个3D渲染器(为了好玩和研究),所以我需要一种将帧缓冲区绘制到窗口的方法。因为我所有的计算都是在CPU上进行的,所以绘图需要尽可能快

我的目标之一是不使用现有的图形库(OpenGL/DirectX),因此屏幕上的图形是纯Win32的。在我的研究中,我发现了几种创建和绘制位图的方法,现在我正在寻找最好的方法

我当前的实现使用了一个使用
CreateDIBSection()
创建的位图,该位图使用
BitBlt()
绘制到我的窗口DC

CreateDIBSection()。使用此方法,我实现了约260 FPS的更新速率(不进行任何渲染)。
这似乎有点慢,所以我正在寻找优化

我读过一些关于这方面的文章,如果不使用与系统调色板相同的调色板创建位图,就会进行一些缓慢的颜色转换

如何确保我的DIB位图和窗口兼容

是否有比我当前的实现更快的位图绘制方法

我还读了一些关于
DrawDibDraw()
,有人能确认这更快吗

我读过一些关于这方面的文章,如果不使用与系统调色板相同的调色板创建位图,就会进行一些缓慢的颜色转换

很少有系统在调色板模式下运行,所以这似乎不太可能是您的问题

除了调色板之外,如果源位图和目标位图具有不同的色域,某些GDI函数还会导致应用颜色匹配转换。然而,BitBlt不进行这种颜色匹配,因此您不需要为此付出代价

如何确保我的DIB位图和窗口兼容

你没有。您可以使用DIB(独立于设备的位图)或兼容(依赖于设备的)位图。您的DIB位图可能与设备的当前模式匹配。例如,如果您使用的是32 bpp的DIB,并且您的显示器处于相同的模式,则无需进行转换。如果你想要一个保证与你的设备处于相同模式的位图,那么你不能使用DIB和它为可预测的像素布局和格式提供的所有好的属性

是否有比我当前的实现更快的位图绘制方法

限制很可能是从系统内存到图形适配器内存中获取数据。为了克服这个限制,您需要一个更快的图形总线,或者您需要直接渲染到图形内存中,这意味着您需要在GPU而不是CPU上进行计算

如果以每像素24位的速度渲染1920 x 1080像素的图像,则帧缓冲区的容量接近6MB。这是大量的数据。如果你每秒做260次,那真是太令人印象深刻了

我也读过一些关于DrawDibDraw()的文章,有人能确认这更快吗

这是可以想象的,但唯一知道的方法是测量它。由于图形适配器(以及它们使用的总线)的不同,结果可能会因机器而异。

Windows不“实时”执行任何操作。blitting的速度取决于您的图形硬件,但260 FPS在我看来并不慢……您在没有尝试任何东西的情况下问“DrawDibDraw快吗?”。当然,这并不比什么都不做快。像素格式至关重要。试试看。