【问题标题】:Real time drawing in GDIGDI中的实时绘图
【发布时间】:2013-04-12 23:14:36
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • Windows 不会“实时”执行任何操作。 blitting 的速度取决于您的图形硬件,但 260 FPS 对我来说似乎并不慢...
  • 您是在询问“DrawDibDraw 是否更快”而没有尝试任何操作。当然,这并不比什么都不做更快。像素格式至关重要。试试看。

标签: c++ winapi graphics bitmap gdi


【解决方案1】:

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

很少有系统在调色板模式下运行,所以这对您来说似乎不太可能。

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2020-02-16
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多