2014-04-21 73 views
1

我正在嘗試創建一個簡單的D2D遊戲引擎(它必須能夠在一個窗口中顯示和移動圖像,至少),並且一切都正確無誤,直到我決定切換到多線程版。我讀了this MSDN文章,它建議從多個線程使用一個多線程工廠。但this文章聲稱有幾個單線程工廠會更有效(儘管本文描述了服務器端渲染場景,原理與我的情況相同,我錯了嗎?)。當我嘗試使用單線程單工廠方法時,所有圖像都會顯示並移動,但閃爍很可怕。在我的WM_PAINT處理程序我試圖做這樣的事情:Direct2D中的多線程

for (CSingleThreadEngine *pElSingleThreadEngine : m_SingleThreadEngines) //each CSingleThreadEngine instance has its own D2D factory and an image collection 
    pElSingleThreadEngine->Draw(); 

和pElSingleThreadEngine->繪製()不拉這樣的:

m_pRenderTarget->BeginDraw(); 
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); 
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); 
for (CGameImage *pImage : m_GameImages) 
{ 
    if (FAILED(pImage->Draw())) 
     throw runtime_error("An object cannot be drawn"); 
} 
m_pRenderTarget->EndDraw(); 

我認爲這裏的錯的是有幾個ID2D1HwndRenderTarget只有一個窗口的實例,因爲如果我在一個單獨的窗口中繪製每個線程,它就可以正常工作。但是我只想繪製一個窗口,並且我無法避免爲此使用多個ID2D1HwndRenderTarget實例。所以我的問題是:

  1. 什麼是根本創建多線程Direct2D應用程序的最佳做法?
  2. 如果我使用的方法是正確的,我做錯了什麼,我該如何解決它?

任何幫助將不勝感激。

+0

所以沒有人知道答案?那麼,也許是一個提示或什麼...(( – GreenForester

+0

)可能相關:http://stackoverflow.com/questions/33143589/efficient-direct2d-multithreading –

回答

0

我看不到爲什麼你爲單個窗口使用多個HWND渲染目標的原因。你有沒有嘗試爲每個線程創建排名位圖,並將其繪製到單個hwnd渲染目標上?

+0

這個想法來得早一點,但一些對象只需要使用它們在創建它們的線程中,所以我正在修復bug並重構程序現在我肯定會接受你的答案,如果我讓它工作:) – GreenForester

+0

謝謝,它似乎離屏位圖方法真的起作用。我試圖畫出幾千幅圖像,最終我得到了E_OUTOFMEMORY HRESULT(雖然還有很多可用的RAM)。但閃爍的問題已消失。) – GreenForester

+0

公羊和視頻RAM之間有區別。當您創建direct2d位圖(Id2d1Bitmap)時,它會加載到視頻RAM中,直到您處理接口並釋放資源。另一方面,如果您通過WIC API加載圖像,它將存儲在內存中。我不知道你的情況如何。 –