我正在爲Windows Store編寫電子書閱讀器應用程序。我使用Direct2D + DXGI交換鏈在屏幕上呈現書籍頁面。高效的Direct2D多線程
我的圖書內容有時非常複雜(幾何圖形,位圖,蒙版等),所以最多可能需要100 ms的時間來渲染。所以我試圖在一個單獨的線程中對一個位圖進行離屏渲染,然後在主線程中顯示這個位圖。
但是,我不知道如何有效地做到這一點。
到目前爲止,我已經試過兩種方法:
使用單一
ID2D1Factory
與D2D1_FACTORY_TYPE_MULTI_THREADED標誌,創建ID2D1BitmapRenderTarget
,並用它在後臺線程閉屏渲染。 (這還需要ID2D1Multithread::Enter/Leave
在IDXGISwapChain::Present
操作)。問題是,後臺線程中的ID2D1RenderTarget::EndDraw
操作有時需要長達100ms,並且由於內部Direct2D鎖定,主線程呈現在此期間被阻止。在後臺線程中使用單獨的
ID2D1Factory
(如http://www.sdknews.com/ios/using-direct2d-for-server-side-rendering中所述)並關閉內部Direct2D同步。在這種情況下,兩條線之間沒有交叉鎖定。不幸的是,在這種情況下,我無法直接在主要的ID2D1Factory
中使用結果位圖,因爲它屬於不同的工廠。我必須將位圖數據移至CPU內存,然後將其複製到主內存ID2D1Factory
的GPU內存中。這個操作也會引入顯着的延遲(我相信這是由於大容量的內存訪問,但我不確定)。
有沒有辦法有效地做到這一點?
P.S.這裏的所有時間都是針對宏碁Switch 10平板電腦的。在常規Core i7 PC上,兩種方法都沒有任何明顯的滯後。