0

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

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

我当前的实现使用使用创建的位图CreateDIBSection(),使用BitBlt().

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

我读过一些关于如果您不使用与系统调色板相同的调色板创建位图的内容,则会完成一些缓慢的颜色转换。

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

有没有比我目前的实现更快的绘制位图的方法?

我也读过一些关于的东西DrawDibDraw(),任何人都可以确认这更快吗?

4

1 回答 1

2

我读过一些关于如果您不使用与系统调色板相同的调色板创建位图的内容,则会完成一些缓慢的颜色转换。

很少有系统不再以调色板模式运行,因此这对您来说似乎不太可能成为问题。

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

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

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

有没有比我目前的实现更快的绘制位图的方法?

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

如果您以每像素 24 位的速度渲染 1920 x 1080 像素的图像,则帧缓冲区接近 6 MB。这是非常多的数据。如果您每秒执行 260 次,那实际上是非常令人印象深刻的。

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

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

于 2013-04-21T16:41:40.680 回答