2012-05-16 13 views
6

Wir müssen 8 bis 12 Monitore von einem PC aus steuern, die alle verschiedene Ansichten eines einzelnen 3D-Szenengraphen darstellen, also mehrere Grafikkarten verwenden müssen. Wir laufen derzeit auf dx9, also schauen wir uns nach dx11 um, um es hoffentlich einfacher zu machen.DirectX 11: gleichzeitige Verwendung mehrerer Adapter

Erste Untersuchungen deuten darauf hin, dass der offensichtliche Ansatz nicht funktioniert - Leistung ist mies, wenn wir nicht jede Karte aus einem separaten Prozess fahren. Websuchen sind nichts. Kann jemand den besten Weg vorschlagen, mehrere Karten gleichzeitig aus einem einzigen Prozess mit dx11 zu verwenden?

+0

Verwenden Sie die Herstellerbibliotheken überhaupt?Wie sieht VRAM-Nutzung und -Übertragung mit einem proc/many aus? Spielen Sie Vollbild-Exklusiv auf jeder Karte, und ändert das etwas, wenn nicht? Senden Sie Frames gleichzeitig an alle (mehrere Render-Threads)? – ssube

+0

@peachykeen: Dies verwendet DirectX von C++. Wir haben ein paar Tests gemacht, werden aber die Kernarbeit nicht für eine Woche beginnen, also dachte ich, ich würde diese Frage jetzt stellen, um zu sehen, ob irgendjemand da draußen zufällig die Antwort kannte - wir haben es nicht getan noch ein tiefgreifendes Profiling oder Debugging. Wir müssen im Fenstermodus laufen, da wir eine Desktop-App sind, und jedes Fenster wird unabhängig von seinem eigenen Thread gerendert (der langsam rennt) oder verarbeitet (der rendert). Wir können unser Rendering auf mehrere Prozesse aufteilen, aber das sollte nicht notwendig sein. –

+0

Haben Sie VSync aktiviert? tatsächlich habe ich in (fast) dem gleichen Anwendungsfall wie Sie einige starke Verlangsamungen bemerkt. Ohne VSync ist es ziemlich in Ordnung. – catflier

Antwort

1

Numerieren Sie die verfügbaren Geräte mit IDXGIFactory, erstellen Sie für jedes ein ID3D11Device und führen Sie sie dann aus verschiedenen Threads ein. Sollte gut funktionieren.

+0

Danke Axel. Das Problem ist, dass wir aus einer Demoszene etwa 30 Bilder pro Sekunde bekommen, aber wenn wir jeden Adapter von einem separaten Prozess aus ansteuern, erhalten wir für dieselbe Rendering-Last ungefähr 600 fps. Es ist möglich, dass unsere anfänglichen Schnellversuche einen Fehler hatten, oder dass es in einem realen Beispiel gut funktionieren würde, aber wir machen uns Sorgen, dass wir einen Renderer sehr viel Aufwand betreiben können, nur um herauszufinden, dass er aufgeteilt werden muss Multi-Prozess, um die volle Leistung aus den Adaptern zu erhalten. Da wir ein bisschen Vorlaufzeit haben, dachte ich, ich würde hier fragen und in ein paar Tagen zurückkommen ... –

+0

Ist das mit D3D9 oder D3D11? Könnte auch ein Treiberproblem sein, das nur eine Instanz von sich pro Prozess anstatt pro Thread erstellt. Welche Karten verwendest du? –

+0

Dies ist DX11, mit brandneuen Karten wie nVidia GT 220, ATI Radeon HD 6700. –

2

Vielleicht brauchen Sie das DirectX nicht zu aktualisieren.
Siehe this article.

+0

Danke, aber jetzt, da DX 9 fast 200 Jahre alt ist, wollen wir wirklich einen Nagel hineinstecken und anfangen DX11-Funktionen zu verwenden, zu vermeiden, dass wir DX9 auf alle unsere Win7-Zielrechner installieren müssen usw. –

2

Ich sehe, dass Sie bereits zu einer Lösung gekommen sind, aber ich dachte, es wäre gut, in meinem eigenen jüngsten Erfahrungen für jemand anderen zu werfen, die auf diese Frage kommt ...

Ja, können Sie eine beliebige Anzahl von Adaptern und Ausgaben aus einem einzigen Prozess steuern. Hier einige Informationen, die hilfreich sein könnte:

In DXGI und DX11:

Jede Grafikkarte ist ein "Adapter". Jeder Monitor ist ein "Output". Weitere Informationen zum Aufzählen durch diese finden Sie unter here. Wenn Sie Zeiger auf die Adapter haben, die Sie verwenden möchten, erstellen Sie ein Gerät (ID3D11Device) mit D3D11CreateDevice für jeden der Adapter. Vielleicht möchten Sie einen anderen Thread für die Interaktion mit jedem Ihrer Geräte. Dieser Thread kann eine bestimmte Prozessoraffinität aufweisen, wenn dies die Geschwindigkeit für Sie erhöht.

Sobald jeder Adapter über ein eigenes Gerät verfügt, erstellen Sie einen swap chain und render target für jeden Ausgang. Sie können auch create your depth stencil view für jeden Ausgang, während Sie gerade dabei sind.

Beim Erstellen einer Tauschkette müssen Ihre Fenster eingerichtet werden: ein Fenster pro Ausgabe. Ich glaube nicht, dass das Rendering von das Fenster, das die Swap-Kette enthält, viel von Vorteil ist. Sie können die Fenster nur als Hosts für Ihre Swap-Kette erstellen und sie anschließend vollständig vergessen.

Für das Rendern müssen Sie jeden Ausgang jedes Geräts durchlaufen. Ändern Sie für jede Ausgabe das Renderziel des Geräts in das Renderziel, das Sie für die aktuelle Ausgabe erstellt haben, indem Sie OMSetRenderTargets verwenden. Auch hier können Sie jedes Gerät in einem anderen Thread ausführen, sodass jedes Thread/Geräte-Paar eine eigene Iteration über die Ausgaben zum Rendern hat.

Hier sind ein paar Links, die hilfreich sein könnten, wenn durch diesen Prozess gehen:

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

Viel Glück!