Codierung für ein wirklich, wirklich hochauflösendes Display-Array

17

Ich wurde beauftragt, eine Echtzeit-Vollbild-Demo zu erstellen, die auf einem 5x2-Array von 60+ Zoll-LED-Fernsehern oder mit anderen Worten auf einem 20-Megapixel-Display ausgeführt werden kann.

Wir haben eine Maschine gebaut, die einen einzelnen Win7-Desktop mit voller Auflösung über die Displays verteilen kann, und einige ziemlich anständige Grafikkarten.

Meine Frage ist: Abgesehen von der lächerlichen Menge an Arbeit, die meine Pixel-Shader leisten werden, gibt es noch andere Einschränkungen von DX10. Ich werde bis nächste Woche keinen Zugriff auf die Hardware haben, möchte aber bis dahin etwas schreiben, mit dem ich das System vergleichen kann.

Aktualisieren

Während es sich herausstellte, dies auf einem einzelnen Computer mit einer Reihe von AMD EyeFinity-Karten (mit 6 Ausgängen) zum Laufen zu bringen, stellte sich heraus, dass die "einfachste" Möglichkeit darin bestand, ein DX-Fenster pro Anzeige mit einer Fensterbreite von Anzeigen zu erstellen Es hat einige Leistungsprobleme verursacht - ich habe es auch ziemlich gut zum Laufen gebracht, indem ich die Aufgabe auf eine Gruppe von Computern verteilt habe, von denen jeder zwei Bildschirme steuert.

Es war überraschend einfach. Für meine Test-XNA-App habe ich eine GameComponent hinzugefügt, die den Spielstatus (Kameraposition / -ausrichtung usw.) erfasst und über das lokale Subnetz pro Frame per UDP-Spam versendet.

Diese Komponente verfügt über einen ModeSchalter (Senden oder Empfangen). Im ReceiveModus werden UDP-Datagramme abgerufen und der Spielstatus mit den Informationen des Absenders aktualisiert. SendDer Modus sendet nur Statuspakete und bewirkt über einen Dienst / Daemon, dass Knoten die Client-App starten oder stoppen. Jeder Client kann als "Master" fungieren und das Umschalten eines Clients in den SendModus fordert alle anderen Knoten zum Umschalten auf Receive. Es ist ziemlich unterhaltsam zu sehen, was passiert, wenn Menschen um die Kontrolle kämpfen.

Ein weiterer netter Vorteil: Ich habe eine Konsolen-App erstellt, die eine Reihe von Keyframe-Statusdefinitionen - Ort, Zeit usw. - nach Bedarf interpoliert und sie mit demselben Code sendet, der in der Game-Engine verwendet wird. Auf diese Weise kann ich einfach Skripte erstellen, Transformationen von einem Webbrowser aus übermitteln usw.

Insgesamt wurden etwa 50 Codezeilen benötigt, um mehrere Kopien der App synchron laufen zu lassen. Eine gewisse zusätzliche Komplexität ergab sich aus dem Versetzen der Kameraposition für jede Maschine und dem Korrigieren einiger Belästigungen durch Perspektive / Projektion. Der größte Teil davon stammte jedoch aus einer knotenbezogenen Konfigurationsdatei.

3Dave
quelle
2
Das klingt nach einem wirklich lustigen Projekt.
Cypher
1
Ja. Ich gackerte fast und muah-ha-ha'd.
3Dave
3
Ich hätte es mit 10 billigen Dirt Commodity-Maschinen geschafft, von denen sich jede nur darum gekümmert hatte, ein kleines Stück der Weltanschauung zu rendern und vernetzt zu sein, um die Zeitsynchronisation und -kontrolle von einer Master-Box aus aufrechtzuerhalten. Anstelle einer hochaktuellen, ungetesteten Maschinenkonfiguration mit einem hohen F & E-Risiko wäre dies eine Lösung in Dosen mit sehr geringem Risiko. Das bin aber nur ich, YMMV.
Patrick Hughes
So wäre ich gelaufen, aber ich habe keine Hardware gekauft. = /
3Dave
Tatsächlich klingt der Aspekt des synchronisierten Renderns im Netzwerk fantastisch. Herausfordernd, aber ich kann schon sagen, wie es geht. Und bietet eine gewisse Flexibilität: Es ist nicht erforderlich, mehrere Streams von einer Box zu rendern, wenn Sie das Array teilen möchten. "Parallel" ist eines meiner Lieblingswörter!
3Dave

Antworten:

5

Ich würde mich genauso um die Hardware-Konfiguration kümmern wie um die Software. Sie müssen nicht jedes Fernsehgerät mit seiner nativen Auflösung betreiben, und die Bildschirmgröße unterscheidet sich von der Auflösung. Ich gehe davon aus, dass die 60-Zoll-Fernsehgeräte jeweils 1920 x 1080 Pixel groß sind. Die native Auflösung für alle Fernsehgeräte beträgt 9600 x 2160 Pixel, wenn Sie 5 Zeilen x 2 Fernsehspalten meinten, oder 3840 x 5400 Pixel, wenn Sie 5 Spalten x 2 Zeilen meinten.

Die neueste AMD Radeon-Karte, eine 7970, unterstützt eine Auflösung von bis zu 4096 x 2160 pro Bildschirm bei maximal zwei Bildschirmen, wenn Sie DisplayPort 1.2 zum Übertragen von Videos verwenden. Auf diese Weise nähern Sie sich möglicherweise der nativen Auflösung. Auf diese Weise funktioniert es jedoch nicht mit bis zu 5 Fernsehgeräten.

Die AMD Radeon 6870 Eyefinity 6 unterstützt bis zu 6 Ausgänge gleichzeitig, jedoch nur über eine maximale Auflösung von 5760x2160. Es unterstützt auch eine Crossfire-Konfiguration, die Ihre Leistung erheblich verbessert. Bedenken Sie, dass die zusätzlichen GPUs keine höhere maximale Auflösung liefern.

Ich bin mir nicht sicher, wie Sie mit 10 Bildschirmen gleichzeitig arbeiten können, wenn Sie keine vollständig benutzerdefinierten Bildschirmeinstellungen haben oder Ihr Videosignal nicht auf mehrere Monitore / Fernseher aufteilen möchten. Wenn Sie über diese Funktion verfügen, suchen Sie nach der schnellsten Grafikkonfiguration, die eine Auflösung unterstützt, die Ihrer nativen Auflösung am nächsten kommt. Sobald Sie dies erreicht haben, ist es am besten, Ihre Pixel-Shader so billig wie möglich zu halten und eine Überzeichnung zu vermeiden, was bedeutet, dass Sie einzelne Pixel mehr als einmal berechnen. Kegelstumpf- und Okklusionsentfernung sowie Tiefensortierung tragen in hohem Maße zur Reduzierung von Überzügen bei. Was das Limit in DX10 angeht, bin ich mir nicht sicher, ob es ein Limit für die Auflösung gibt. Ich bin mir sicher, dass es eines gibt, aber es ist wahrscheinlich größer als jede DX10-Karte, die existiert.

Nic Foster
quelle
Auf der Hardware wird bereits das gesamte Array ausgeführt, wobei jedes einzelne Display eine Auflösung von 1920 x 1080 aufweist. seine 5 Spalten durch zwei Reihen. Ein anderer Typ hat ein OpenGL-Fenster mit voller Auflösung und einem rotierenden Drahtmodell. Ich wundere mich nur über irgendwelche DX-Einschränkungen, die später auf mich zukommen und mich beißen könnten.
3Dave
1
Soweit ich weiß, werden Sie von DX10 nicht in der von Ihnen beschriebenen Auflösung eingeschränkt. Wenn Sie in der Lage sind, bereits in diesem Setup anzuzeigen, ist die Leistung Ihr einziges Anliegen, und die Handhabung dieser Leistung ist wie bei jedem anderen Spiel / Programm, das aufgrund des zusätzlichen Bildschirmbereichs nur erheblich vergrößert wird.
Nic Foster
6

Sie können problemlos ein Render-Ziel mit einer Größe erstellen, die der Testleistung entspricht. Sie müssen es verkleinern oder vergrößern, wenn Sie es in den Backbuffer kopieren, bis Sie die echte Hardware erhalten.

Adam
quelle