2012-05-16 29 views
6

我們需要從一臺pc驅動8到12個顯示器,所有渲染單個3d場景圖的不同視圖,因此必須使用多個顯卡。我們目前在dx9上運行,所以希望轉移到dx11,希望能夠讓這個更容易。DirectX 11:同時使用多個適配器

初步調查似乎表明,這種明顯的方法行不通 - 性能很差,除非我們從一個單獨的進程中驅動每張卡。網絡搜索沒有任何結果。任何人都可以建議使用dx11從單個進程同時使用多張卡片的最佳方式嗎?

+0

您是否在使用供應商庫?一個proc/many VRAM的使用和傳輸是什麼樣的?你是否在每張卡上運行全屏獨佔,如果沒有,這會改變什麼?你是否同時向所有人發送幀(多個渲染線程)? – ssube

+0

@peachykeen:這是使用C++的DirectX。我們已經完成了一些初步測試,但是一週左右不會開始核心工作,所以我想現在我會問這個問題,看看有沒有人知道答案 - 我們還沒有完成任何深入的分析或調試。我們需要以窗口模式運行,因爲我們是桌面應用程序,每個窗口都獨立於其自己的線程(緩慢顯示)或進程(渲染速度快)進行渲染。我們可以將我們的渲染分成多個進程,但這不應該是必需的。 –

+0

您是否啓用了VSync?實際上我發現在幾乎和你一樣的用例中有一些嚴重的減速。沒有VSync就可以了。 – catflier

回答

1

使用IDXGIFactory枚舉可用設備,爲每個設備創建一個ID3D11Device,然後從不同線程提供它們。應該工作正常。

+0

謝謝阿克塞爾。問題是,當我們這樣做時,我們從演示場景中每秒獲得大約30幀,但是如果我們從一個單獨的過程驅動每個適配器,則對於相同的渲染負載,我們可以獲得大約600 fps的速度。我們最初的快速試驗可能有一個錯誤,或者在真實世界的例子中,它實際上可以正常工作,但我們擔心我們可能會花費很多努力到渲染器中,以便發現它必須被分割多進程以獲得適配器的完整性能。由於我們有一段時間,我以爲我會在這裏問幾天後再回來... –

+0

這是D3D9還是D3D11?也可能是一個驅動程序問題,它只爲每個進程創建一個實例,而不是每個線程。你用什麼卡? –

+0

這是DX11,使用像nVidia GT 220,ATI Radeon HD 6700這樣的全新卡。 –

2

也許你不需要升級Directx。
this article

+0

謝謝,但現在DX 9已經有近200年的歷史了,我們真的想要堅持使用它,並開始使用DX11功能,避免將DX9安裝到我們所有的Win7目標機器上等等。 –

2

我看你已經到了一個解決方案,但我認爲這會是很好的爲別人誰在談到這個問題,我自己最近的經驗扔...

是的,你可以從一個進程中驅動任意數量的適配器和輸出。這裏的一些信息可能會有所幫助:

在DXGI和DX11:

每個顯卡是一個「適配器」。每個監視器都是「輸出」。有關通過這些枚舉的更多信息,請參閱here

指向要使用的適配器的指針後,使用D3D11CreateDevice爲每個適配器創建一個設備(ID3D11Device)。也許你想要一個不同的線程與每個設備進行交互。如果此線程有助於爲您加快速度,則此線程可能具有特定的處理器關聯性。

一旦每個適配器都有自己的設備,爲每個輸出創建一個swap chainrender target。對於每個輸出,您也可以使用create your depth stencil view

創建交換鏈的過程將需要設置您的窗口:每個輸出一個窗口。我認爲從包含交換鏈的窗口驅動不會帶來太多好處。您可以創建窗口作爲您的交換鏈的主機,然後在完成後忘記它們。

對於渲染,您需要遍歷每個設備的每個輸出。對於每個輸出,使用OMSetRenderTargets將設備的渲染目標更改爲您爲當前輸出創建的渲染目標。同樣,如果您願意,您可以在不同的線程上運行每個設備,因此每個線程/設備對都將通過渲染輸出進行自己的迭代。

這裏有一堆的鏈接通過這個過程去時可能會有所幫助:

Display Different images per monitor directX 10

DXGI and 2+ full screen displays on Windows 7

http://msdn.microsoft.com/en-us/library/windows/desktop/ee417025%28v=vs.85%29.aspx#multiple_monitors

祝你好運!