gpt4 book ai didi

interop - 使用 Direct2d Gdi Interop 渲染目标的 GDI 对象泄漏

转载 作者:行者123 更新时间:2023-12-02 16:55:28 33 4
gpt4 key购买 nike

我正在尝试在兼容的渲染目标上使用 Gdi 和 Direct 2D 来渲染位图。我使用 D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE 选项创建兼容目标,然后执行以下操作:

HDC hdc=NULL;
ID2D1GdiInteropRenderTarget *gdiTarget=NULL;
target->QueryInterface(__uuidof(ID2D1GdiInteropRenderTarget), (void**)&gdiTarget);
target.BeginDraw();
HRESULT hr=gdiTarget->GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, &hdc);
if(SUCCEEDED(hr))
{
/* Gdi drawing code(hdc)*/

gdiTarget->ReleaseDC(NULL);
}
/* Direct2D drawing code
target->EndDraw();
gdiTarget->Release();

但似乎出了问题,因为每次我调用这个渲染方法时,我都会遇到许多 GDI 对象泄漏。我也尝试这样做:

HDC hdc=NULL;
ID2D1GdiInteropRenderTarget *gdiTarget=NULL;
target->QueryInterface(__uuidof(ID2D1GdiInteropRenderTarget), (void**)&gdiTarget);
target.BeginDraw();
HRESULT hr=gdiTarget->GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, &hdc);
if(SUCCEEDED(hr))
gdiTarget->ReleaseDC(NULL);
target->EndDraw();
gdiTarget->Release();

我也遇到了泄漏。我还尝试在 ID2D1GdiInteropRenderTarget 创建的 HDC 上使用 DeleteDC() 或 ReleaseDC() 但没有成功。

有什么建议吗?提前致谢!

最佳答案

如果渲染目标使用加速,那么结果的性能不会很高。您应该强烈考虑在 D2D 中进行原生渲染。原因是您会产生从 GPU 传输到系统的成本。我已经将很多绘图代码移植到原生 D2D 中。有一些 api 您可能需要 GDI(异或等),但通常即使是那些 API 也应该尝试另一种方法。

我不确定您为什么会出现泄漏,但您需要遵循此处的指南: http://msdn.microsoft.com/en-us/library/windows/desktop/dd370971(v=vs.85).aspx

我不建议使用 dc 渲染目标,它比使用 GDI+ 慢。对于需要的一些调用,请使用概述的第二种方法。
此外,您还需要处理 D2D 中可能有效的任何剪辑/图层。

最后,您需要在调用 EndDraw 之前释放 GDI 接口(interface)。

关于interop - 使用 Direct2d Gdi Interop 渲染目标的 GDI 对象泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071318/

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