gpt4 book ai didi

c++ - 从 COLORREF[] 中绘制 DeviceContext

转载 作者:行者123 更新时间:2023-11-30 00:59:57 28 4
gpt4 key购买 nike

我有一个指向 COLORREF 缓冲区的指针,类似于:COLORREF* buf = new COLORREF[x*y];

一个子程序用颜色信息填充这个缓冲区。每个 COLORREF 代表一个像素。

现在我想将此缓冲区绘制到设备上下文。我当前的方法有效,但速度很慢(== ~200ms 每幅图,具体取决于图像的大小): p>

for (size_t i = 0; i < pixelpos; ++i) 
{
// Get X and Y coordinates from 1-dimensional buffer.
size_t y = i / wnd_size.cx;
size_t x = i % wnd_size.cx;
::SetPixelV(hDC, x, y, buf[i]);
}

有没有办法更快地做到这一点?一次全部,而不是一个接一个像素?
我对 GDI 不是很熟悉。我听说过很多 API,例如 CreateDIBitmap()、BitBlt()、HBITMAP、CImage 等等,但不知道如何应用它。看起来很复杂...
也欢迎使用 MFC。

有什么想法吗?

提前致谢。

(背景:我上面提到的子程序是一个 OpenCL 内核 - GPU 计算一个 Mandelbrot 图像并将其保存在 COLORREF 缓冲区中。)

编辑:
谢谢大家的建议。这些答案(和链接)让我对 Windows 图形编程有了一些了解。性能现在可以接受(半实时滚动到 Mandelbrot 作品中:)
我最终得到了以下解决方案 (MFC):

...
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);

CBitmap mandelbrotBmp;
mandelbrotBmp.CreateBitmap(clientRect.Width(), clientRect.Height(), 1, 32, buf);

CBitmap* oldBmp = dcMemory.SelectObject(&mandelbrotBmp);
pDC->BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &dcMemory, 0, 0, SRCCOPY);

dcMemory.SelectObject(oldBmp);
mandelbrotBmp.DeleteObject();

所以基本上 CBitmap::CreateBitmap() 使我免于使用原始 API(我仍然不完全理解)。 CDC::CreateCompatibleDC 文档中的示例也很有帮助。
我的 Mandelbrot 现在是蓝色的——使用 SetPixelV() 它是红色的。但我想这与 CBitmap::CreateBitmap() 解释我的缓冲区有关,并不是很重要。

我可能会尝试 OpenGL 的建议,因为它本来是更合乎逻辑的选择,而且无论如何我都想在 Linux 下尝试 OpenCL。

最佳答案

在这种情况下,我可能会使用 DIB 部分(您使用 CreateDIBSection 创建)。 DIB 部分是一个位图,允许您将内容直接作为数组访问,但仍可将其与所有常用的 GDI 函数一起使用。

我认为这将为您提供基于 GDI 的最佳性能。如果你需要更好的,那么 @Kornel 基本上是正确的——你需要切换到对硬件加速有更直接支持的东西(DirectX OpenGL——尽管 IMO,OpenGL 是一个更好的工作的选择而不是 DirectX)。

鉴于您目前正在 OpenCL 中进行计算并将输出存储在颜色缓冲区中,OpenGL 将是真正显而易见的选择。特别是,您可以让 OpenCL 将输出存放在 OpenGL 纹理中,然后让 OpenGL 使用该纹理绘制四边形。或者,由于您只是将输出放在屏幕上,您可以在 OpenGL 片段着色器(或者,当然,DirectX 像素着色器)中进行计算,这样您就不会将输出放入屏幕外的内存中这样您就可以将结果复制到屏幕上。如果没记错的话,橙皮书有一个 Mandelbrot 着色器作为其示例之一。

关于c++ - 从 COLORREF[] 中绘制 DeviceContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3592116/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com