2011-06-05 55 views
4

理想情況下,我想讓多個工作線程能夠渲染到離屏渲染目標,然後將渲染內容「傳送」到屏幕上的目標。用hwnd渲染目標這似乎不是一個問題(msdn有它的一個例子)。使用Direct2D和DXGI(D3D interop)進行多線程的最佳做法是什麼?

我不太清楚如何在屏幕渲染目標基於DXGI交換鏈時執行此操作。據我所知,每個窗口只能有一個交換鏈。因此,我只能根據交換鏈獲得單個渲染目標。這意味着屏幕渲染只能通過該單個渲染目標完成。

如果我上面的假設是正確的,那麼處理多線程渲染的最佳方法是什麼?我是否需要序列化訪問屏幕上的目標?工作線程應該共享一個多線程d2d工廠嗎?如果適當的鎖定機制就位,屏幕上的目標的BeginDraw/EndDraw/Present可以在工作線程(即沒有創建屏幕目標的線程)上執行嗎?

我會感激任何的建議。 謝謝。

回答

1

對於離屏渲染目標,您可以創建單獨的D2DFactory並將其附加到使用CreateWicBitmapRenderTarget或CreateDxgiSurfaceRenderTarget創建的各個離線渲染目標。在將其傳輸到屏幕目標時,您必須等待所有線程完成,然後將每個屏幕外RT逐個傳輸到屏幕RT。

4

我正在處理這個相同的問題吧!根據我在MSDN上閱讀,最好的辦法是:

我還沒有得到一個可靠的工作多線程的Direct2D函數集,即使在這之後,所以這就是我迄今爲止所知道的 - 我還不知道其他的注意事項等肯定存在。

一些有用的鍵位:

您可以創建多線程的Direct2D工廠實例。您可以使用 和共享一個多線程的工廠,並從多個 以上的線程所有它的資源,但訪問這些資源(通過調用的Direct2D) 通過Direct2D的序列化,所以不會發生衝突的訪問。如果您的應用程序 僅調用Direct2D API,則此類保護會自動通過 Direct2D以最小開銷以粒度級別完成。

ID2D1Factory* m_D2DFactory; 

// Create a Direct2D factory. 
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_MULTI_THREADED, 
    &m_D2DFactory 
); 

還有這個非常重要的警示:

多線程注意事項

當你在 多線程應用程序中使用DXGI,你必須要小心,以避免產生死鎖, 其中兩個不同的線程正在彼此等待完成。 有兩種情況可能發生。

  • 渲染線程是 而不是消息泵線程。
  • 執行DXGI API的螺紋是不 創建窗口相同的線程。

要小心,你從來沒有 有渲染線程上的消息泵線程等待,當你使用 全屏交換鏈。例如,調用 IDXGISwapChain1 ::存在1(從渲染線程)可能導致 渲染線程等待消息泵線程上。當一個模式改變 發生,這種情況是可能的,如果存在1調用:: SetWindowPos() 或:: SetWindowStyle()和任一方法調用 :: SendMessage函數()。在這種情況下,如果消息泵線程都有一個 關鍵部分守着它,如果渲染線程被阻塞,然後 兩個線程就會死鎖。

相關問題