2012-10-25 65 views
3

我試圖在兼容的渲染目標上使用Gdi和Direct 2D同時渲染位圖。 我創建D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE選擇兼容的目標,然後我做的如下:使用Direct 2D的GDI對象泄漏GdiInteropRenderTarget

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(),但沒有成功。

有什麼建議嗎? 在此先感謝!

回答

1

我發現了這個問題。這是一個沒有發佈的d2dBitmap,有時會導致內存泄漏,當我試圖釋放ID2D1GdiInteropRenderTarget時,它會導致Gdi對象泄漏。

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

gdiTarget->ReleaseDC(NULL); 
} 
/* Direct2D drawing code 
compatibleTarget->EndDraw(); 
gdiTarget->Release(); 
ID2D1Bitmap *bitmap=NULL; 
compatibleTarget->GetBitmap(&bitmap); 
target->BeginDraw(); 
target->DrawBitmap(bitmap); 
target->EndDraw(); 
compatibleTarget->Release(); // I thought this only enough 
bitmap->Release();    // This solved the problem 

我還是有點困惑,其目標的類型,最好使用(DC或HWND),因爲我發現不同的性能取決於我是否不使用GPU。 特別是,我發現以下問題:

  • 如果我使用DCRenderTarget我不能使用硬件加速(或默認),因爲我繼續違反內存保護區。如果我使用HwndRenderTarget,則不會發生這種情況。
  • 如果我使用HwndRenderTarget,在一般的一切都很好,但我失去焦點的窗口,它不承認則KeyPressed消息,並且,如果我使用GPU,性能下降了很多,強烈地依賴於數量活動目標(如果我使用軟件加速,則不會發生這種情況)。

有沒有人遇到過同樣的問題? 你能推薦一些嗎?

2

如果渲染目標正在使用加速度,那麼結果不會非常高效。您應該強烈考慮在D2D中本地渲染。 原因是你將花費從GPU轉移到系統。我已經將很多繪圖代碼移植到本地D2D。有幾個apis可能需要GDI(xor等),但通常甚至那些應該嘗試一種替代方法。

我不知道爲什麼你所得到的泄漏,但你要在這裏遵循的準則: http://msdn.microsoft.com/en-us/library/windows/desktop/dd370971(v=vs.85).aspx

我不會建議使用DC渲染目標,比使用GDI +慢。 而不是幾個需要的調用,使用概述的第二種方法。
此外,您將需要處理D2D中可能有效的任何剪裁/圖層。

最後,你會想在調用EndDraw之前釋放GDI接口