2011-08-25 41 views
3

以前,當我構建工具時,我已經使用了D3D版本9,其中調用Present()可以獲取目標窗口和矩形,因此可以從單個設備繪製到多個不同的窗口。使用D3D加速桌面應用程序和/或構建工具而非遊戲時,這非常棒!因爲狀態管理和線程界面設計得很好,你甚至可以瞄準在野外仍然很常見的D3D 9級別的硬件(作爲一個遊戲渲染器)與D3D 10相反,D3D 10只能瞄準10倍和更好)。如何使用IDXGISwapChain和ID3D11Device/ID3D11DeviceContext展示給不同的窗口?

但是,現在我想用D3D11構建一個工具。不幸的是,從D3D11CreateDeviceAndSwapChain()返回的IDXGISwapChain似乎「記住」了它的HWND,並且只想呈現給該窗口。這非常不方便,因爲我可能有大量的窗口,每個窗口都需要繪製相當簡單的圖形,並且只能響應WM_PAINT(同樣,這是針對工具而不是遊戲)。

我想要做的是保存回緩衝RAM。具體來說,我曾經能夠創建一個單一的後臺緩衝區,即桌面的大小,我知道它可以覆蓋所有渲染需求,然後這將是分配的單個副本。即使有10個重疊的窗口,它們都通過相同的後臺緩衝區進行渲染,所以除了初始分配之外,不會浪費內存。我可以創建不交換鏈的紋理,並將它們用作「渲染目標」,但我無法找到一種呈現任意客戶端窗口的任意矩形的好方法,無需讀回位圖並將其複製到DIBSection,這將是非常低效的。此外,無法創建多個交換鏈,並讓它們共享相同的後臺緩衝區。

我可以做的最好的做法是爲每個窗口創建一個交換鏈,並將每個交換鏈的後臺緩衝區調整爲非常小,除非我呈現到交換鏈時,我調整其大小以匹配窗口。然而,這似乎效率低下,因爲調整目標並不是「免費」的AFAICT操作。那麼,有沒有更好的方法?

回答

1

我最終的答案是爲每個單獨的顯示區域創建一個後臺緩衝區,而不是將其大小設置爲後臺緩衝區。我認爲,在一個桌面組成和透明度可以讓我高興「背後」任何東西的世界裏,這對系統可能是有幫助的。 學習愛上VVM系統,我猜:-)(虛擬顯存的VVM)

相關問題