在GDI中实时绘图

时间:2013-04-19 14:12:54

标签: c++ winapi graphics bitmap gdi

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

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

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

CreateDIBSection()给我一个指向我的位图字节的指针,这样我就可以在不复制的情况下操作它。使用此方法,我实现了大约260 FPS的更新速率(没有完成任何渲染)。 这似乎有点慢,所以我正在寻找优化。

如果你没有创建一个与系统调色板具有相同调色板的位图,我已经阅读了一些关于它的内容,完成了一些慢速颜色转换。

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

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

我还阅读了有关DrawDibDraw()的内容,有人可以确认这更快吗?

1 个答案:

答案 0 :(得分:2)

  

如果您没有使用与系统调色板相同的调色板创建位图,我已经阅读了一些内容,可以进行一些慢速色彩转换。

很少有系统以调色板模式运行,所以这似乎不太适合你。

除了调色板之外,如果源位图和目标具有不同的色域,一些GDI函数也会导致应用颜色匹配转换。但是,BitBlt不会进行这种颜色匹配,所以你不会为此付出代价。

  

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

你不是。您可以使用DIB(与设备无关的位图)或兼容(与设备相关的)位图。您的DIB位图可能与您设备的当前模式匹配。例如,如果您使用32 bpp DIB,并且您的显示器处于相同模式,则无需转换。如果您希望某个位图保证与您的设备处于同一模式,那么您就无法使用DIB及其为可预测的像素布局和格式提供的所有良好属性。

  

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

限制很可能是将数据从系统内存传输到图形适配器内存。要解决这个限制,你需要一个更快的图形总线,或者你需要直接渲染到图形内存中,这意味着你需要在GPU而不是CPU上进行计算。

如果您以每像素24位渲染1920 x 1080像素图像,则帧缓冲区接近6 MB。这是一个非常多的数据。如果你每秒做260次,那真的相当令人印象深刻。

  

我也读过一些关于DrawDibDraw()的内容,有人可以确认这个更快吗?

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

相关问题