gpt4 book ai didi

c++ - 使用用户分配的内存绘制到 HDC

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:12 25 4
gpt4 key购买 nike

我有一个无窗口的 IViewObject 对象。

我想调用它的 Draw渲染到 Opengl PBO 内存中的函数(或者 OleDraw 更简单)。

现在我首先使用 CreateDIBSection 创建一个 HBITMAP (分配自己的内存)然后从中复制到我的 PBO 内存中。但是,我想避免这个额外的拷贝。我相信这在理论上应该是可能的,因为映射的 PBO 存在于页面锁定内存中。

这就是我今天所做的简化:

hdc = CreateCompatibleDC(nullptr); // Get current DC
HBITMAP bitmap = CreateDIBSection(... hdc, &bitmap_data_...); // Create Bitmap
SelectObject(hdc, bitmap);
m_spViewObject->Draw(... hdc ...); // IViewObject->Draw to bitmap
memcpy(pbo_ptr, bitmap_data_, size);

我的问题是,是否可以让 Draw 函数以某种方式绘制到我指定的内存(在本例中为 PBO),而不是 win32 api (CreateDIBSection) 分配的内存?

一种方法是,是否可以从用户指定的内存中创建一个与设备无关的位图?但是,我没有找到执行此操作的函数。

最佳答案

恕我直言,您尝试做的事情非常合乎逻辑。然而不幸的是,AFAIK 没有传统的方法来做到这一点。

根据 WinAPI DIB 部分分配自己的内存或使用文件映射。 OTOH OpenGL 以自己的方式管理其内存。存在从任何内存块创建 DIB 的选项,但它仅适用于视频驱动程序,用户模式应用程序无法访问。

实际上,避免这种额外复制的可能性非常复杂。您可以创建一个虚拟视频驱动程序(不要与镜像视频驱动程序混淆),获取它的HDC。然后以您的“自定义”方式告诉它应该在哪里绘制(通过 Escape)。然后你可以将这个 HDC 传递给任何你想要绘制的东西,你的虚拟视频驱动程序将直接在你想要的内存上绘制。

此外,要进行实际绘图,您将能够使用操作系统功能。用 GDI 可识别位图 (EngCreateBitmap) 包装您的内存,并使用操作系统 (EngXXXX) 在其上绘制,这样您就只需在您的代码中实现最少的功能司机。

不过这毕竟是一个驱动程序开发。我相信复制内存块足够快(与实际绘图相比),因此您可以保持代码不变。

关于c++ - 使用用户分配的内存绘制到 HDC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056527/

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