Diese Anleitung enthält Anweisungen zur Einrichtung von SMPTE 2110 mit NVIDIA Rivermax für die Arbeit mit nDisplay, insbesondere bei der Arbeit mit In-Kamera-VFX (ICVFX) und einer LED-Wand.
nDisplay-ICVFX-Kamera-Streaming
Die Integration von Medien-Freigabe und Offscreen-Rendering ermöglicht Ihnen die Nutzung von SMPTE 2110-Medienquellen und -Outputs, um eine optimale Clusterleistung zu erzielen. Sie können das Rendern jeder ICVFX-Kamera auf einen eigenen Rechner verschieben und dann die Multicast-Fähigkeiten von SMPTE 2110 nutzen, um diese Kamera-Streams an anderen Knoten auszugeben, die von ihnen abhängen.
Das bedeutet, Sie können Render-Knoten zu Rendering-Kameras zuweisen, was in der Regel besser skaliert als das Rendern sämtlicher innerer Frustums auf allen Render-Knoten. Mit dieser Konfiguration ändern Sie nicht die Art und Weise, wie die UE Pixel an die Wand sendet. Eine Synchronisationskarte wird weiterhin von Compositor-Knoten verwendet, um ihren Output synchron zu senden. Allerdings benötigen Render-Knoten, die für das Rendering von inneren Frustums vorgesehen sind, keine Synchronisationskarte. Außerdem wird in dieser Konfiguration kein PTP-Timing für den SMPTE 2110-Stream verwendet, der von den Instanzen der UE gemeinsam verwendet wird.
Hier ist ein Beispiel für das Konfigurieren eines Cluster aus drei Knoten und zwei ICVFX-Kameras. Dieses Beispiel beginnt mit einer bestehenden Bühnen-Konfiguration, um den Prozess des Umwandelns anhand dieser Hinzufügungen zu zeigen.
Knotenkonfiguration
Suchen Sie im Inhaltsbrowser nach Ihrer nDisplay-Konfiguration und öffnen Sie sie. Dieses Beispiel heißt NDC_MyStage:
Diese Konfiguration hat 3 Knoten für die Wand, und jeder von ihnen rendert eine Viewport-Gruppe. Diese werden nicht verändert.
Knoten Viewports Node_1
VP_W1
Node_2
VP_W2
Node_3
VP_C1 VP_C2
Außerdem hat sie zwei ICVFX-Kameras. Klicken Sie für jede auf + Hinzufügen und wählen Sie dann Neuen Clusterknoten hinzufügen, um einen Knoten zu erstellen, den Sie zum Rendern dieser Kamera verwenden möchten.
Für jeden Knoten:
Legen Sie einen Name fest, der die Kamera identifiziert, die gerendert werden soll.
Deaktivieren Sie Clusterknoten-Position anpassen, um Überlappung zu vermeiden.
Deaktivieren Sie Viewport zu neuem Clusterknoten hinzufügen.
Legen Sie die gewünschte Host-IP fest.
Aktivieren Sie „Monitorloses Rendering“.
Konfigurieren Sie die Grafikkarten, wenn Ihr System mehr als eine hat.
Nach der vollständigen Konfiguration sollte Ihr Dialogfeld Neuen Clusterknoten hinzufügen dem folgenden Bild ähneln:
Nach der Erstellung der Knoten sollte Ihr Cluster dem folgenden Bild ähneln:
Medienkonfiguration: ICVFX-CameraA-Output
Nachdem Sie Knoten für das Rendering der Kamera-Frustums konfiguriert haben, fahren Sie fort und konfigurieren Sie die Medienfreigabe.
Wählen Sie in Ihrem Bühnen-Outliner die Option ICVFXCameraA.
Suchen Sie im Details-Panel den Abschnitt Medien:
Markieren Sie das Kontrollkästchen Aktivieren.
Fügen Sie eine Output-Gruppe für Medien hinzu. Hier konfigurieren Sie, welcher Knoten dieses innere Frustum rendert und wie es gemeinsam verwendet wird.
Der Knoten, den Sie zum Rendern dieser Kamera verwenden möchten, ist Node_CamA für ICVFXCameraA. Wenn Sie ICVFXCameraB konfigurieren möchten, wählen Sie stattdessen „Node_CamB“ aus.
Konfigurieren Sie als Medien-Output-Typ den NVIDIA-Rivermax-Output, um ihn mit ST 2110 freizugeben. Einige Einstellungen sind hier wichtig:
Setzen Sie den Ausrichtungsmodus auf Frame-Erstellung, was bedeutet, dass Ihr Output mit dem Streaming des gerenderten Frustums beginnt, sobald es verfügbar ist, und dabei stets das konfigurierte Frame-Intervall des Streams einhält.
Setzen Sie den Framelocking-Modus auf Blockieren zum Reservieren, um sicherzustellen, dass Sie jeden gerenderten Frame freigeben.
Aktivieren Sie DoFrameCounterTimestamp. Dadurch wird die Frame-Nummer der Unreal Engine in den Video-Stream eingebettet und wird von den empfangenden Knoten verwendet, um zu wissen, welche Samples zu welchem Frame gehören.
Die Erzwingung einer Auflösung ist nicht erforderlich, da die UE die Größe des Frustums automatisch erkennt, sobald es erfasst wird.
Die Framerate ist wichtig. Der 2110-Standard überträgt wie SDI einen Video-Frame über das gesamte Frame-Intervall. Wenn Sie Ihren 2110-Video-Stream auf 24 fps konfigurieren, dauert es 41 ms, bis jeder Frame von den Listeners empfangen wird. Um die Latenz zu minimieren und je nach verfügbarer Bandbreite Ihrer Netzwerkkarte, sollten Sie Ihre Framerate so konfigurieren, dass sie höher ist als die von Ihrem Cluster angezeigte Rate. Das bedeutet, dass Sie bei einem Cluster, der mit 24 fps läuft, das innere Frustum schneller streamen sollten. Die Verwendung von 48, 60 oder einer noch höheren Framerate ist vorzuziehen, Sie müssen dabei aber auf die Bandbreitenverwendung achten.
Verwenden Sie für die Interface-Adresse Platzhalter, um die Konfiguration so flexibel wie möglich zu gestalten, sodass sie auf verschiedenen Rechnern mit unterschiedlichen IPs funktioniert.
Wählen Sie als Stream-Adresse eine eindeutige Multicast-Adresse, um zu vermeiden, dass zwei innere Frustums auf derselben Adresse streamen. Wenn das passiert, sind Empfänger nicht in der Lage, sie zu unterscheiden. Im gezeigten Beispiel verwendet CameraA 225.1.1.10 und CameraB verwendet 225.1.1.11.
Eine Erfassungs-Synchronisation ist hier nicht erforderlich, da der Stream nicht an die Wand übertragen wird.
Ihre Output-Konfiguration sollte dem folgenden Bild ähneln:
Medienkonfiguration: ICVFX-CameraA-Input
Da nun die Output-Seite des ICVFXCameraA-Renderings konfiguriert ist, können Sie auf der Empfangsseite weitermachen. Hier konfigurieren Sie, welche Knoten das gemeinsame Rendering empfangen und wie sie es empfangen.
Fügen Sie zunächst eine Input-Gruppe für Medien hinzu.
Fügen Sie Cluster-Knoten hinzu, um diesen Output zu empfangen. In diesem Fall sind dies alle Knoten, die an die Wand übertragen werden (Node_1, Node_2, Node_3).
Um das gemeinsame Rendering mit ST 2110 zu empfangen, müssen Sie als Medienquelle die Rivermax-Medienquelle konfigurieren. Einige Einstellungen müssen korrekt eingerichtet werden, damit Framelocking mit niedriger Latenz funktioniert.
Verwenden Sie im Spieler-Modus Framelock, damit die Empfänger bei jedem Rendering auf einen erwarteten Frame warten müssen. Anhand der eingebetteten Frame-Zahl können empfangende UE-Instanzen Video-Samples mit der aktuellen Frame-Zahl abgleichen. Ist ein Frame noch nicht eingetroffen, warten die empfangenden Instanzen auf ihn.
Sie können die Option Ohne Latenz verwenden, damit die empfangenden UE-Instanzen ohne zusätzliche Latenz auf eine Frame-Zahl warten, die der aktuellen entspricht. Abhängig vom Inhalt kann das nicht möglich sein. Sie haben auch die Option, einen Latenz-Frame hinzuzufügen, um mehr Spielraum zum Warten auf das innere Frustum zu haben.
Die Auflösung muss nicht erzwungen werden, da sie von den empfangenden UE-Instanzen automatisch erkannt wird, wenn der Stream empfangen wird.
Konfigurieren Sie als Framerate die gleiche Rate, die Sie für den Output verwendet haben.
Verwenden Sie für die Interface-Adresse erneut Platzhalter, da diese von mehreren Knoten des Clusters verwendet wird und sie nicht die gleiche Interface-IP aufweisen.
Konfigurieren Sie die Stream-Adresse und den Port, sodass sie der Output-Konfiguration entsprechen.
Sie können GPUDirect aktivieren, müssen aber sicherstellen, dass die GPU und die DPU (Mellanox Karte) sich im selben Stammkomplex befinden. Ist das nicht der Fall, können die 2110-Pakete verloren gehen, insbesondere wenn mehrere Input-Streams vorhanden sind.
Um GPUDirect vollständig für Input zu aktivieren, setzen Sie
Rivermax.GPUDirectInput=1beim Start der Unreal Engine oder bevor Sie den Rivermax-Stream starten.
Ihre Input-Konfiguration sollte dem folgenden Bild ähneln:
Ihre ICVFXCameraA ist jetzt so konfiguriert, dass sie von einem Render-Knoten zum Cluster freigegeben werden kann. Die Medieneinstellungen sollten folgendermaßen aussehen:
Medienkonfiguration: ICVFX-CameraB
Wenn Sie die Konfiguration von ICVFXCameraA abgeschlossen haben, können Sie nun ICVFXCameraB konfigurieren, die im Wesentlichen dieselben Einstellungen verwendet, abgesehen von den folgenden Details:
Output-Gruppen für Medien
Der Cluster-Knoten, der ICVFXCameraB rendert, ist Node_CamB.
Die Stream-Adresse muss anders sein. Verwenden Sie 225.1.1.11, aber behalten Sie die Port-Nummer.
Input-Gruppen für Medien
Die Stream-Adresse ist die einzige Einstellung, die Sie ändern müssen, damit sie zur Output-Konfiguration passt. In diesem Beispiel: 225.1.1.11.
Sie können eine höhere Framerate für Ihre 2110-Streams verwenden, um die Latenz zu verringern. Dies führt aber zu einem höheren Bandbreitenverbrauch. Dies sollten Sie je nach Netzwerkkonfiguration abwägen. Wenn es andere Geräte im selben Netzwerk gibt, die Bandbreite verbrauchen, müssen Sie dies ebenfalls berücksichtigen.
Beispiel für den Bandbreitenverbrauch:
4k24 RGB10
~6,3 Gb/s
4k48 RGB10
~12,6 Gb/s
8k24 RGB10
~25 Gb/s
8k48 RGB10
~50 Gb/s
nDisplay-ICVFX-Kamera-Streaming und synchroner Output (experimentell)
Anforderungen
Der andere nDisplay-Bereich, den Sie ändern können, betrifft die Art und Weise, wie Sie die Renderings an die LED-Wand senden. Anstatt Streams von der GPU zu senden, können Sie nun ST 2110-Streams direkt von der Netzwerkkarte senden. Indem Sie jeden Knoten mit einer gemeinsamen PTP-Zeitreferenz versehen, können Sie für jeden Stream zur Wand einen Framelock durchführen und ihn synchronisieren und müssen nicht mehr auf eine Synchronisationskarte zurückgreifen.
Voraussetzungen:
Eine Haupt-Uhr, die PTP erzeugt.
Ein Schalter, der ST 2110-Streams unterstützt.
Eine konforme NVIDIA-Netzwerkkarte, etwa die ConnectX-6 BlueField-2.
Der LED-Prozessor muss außerdem in der Lage sein, ST-2110-Streams zu empfangen.
Wenn sie auf diese Weise konfiguriert sind, werden all Ihre Knoten als „Monitorlos“ oder „Offscreen“ konfiguriert. Sie müssen kein Mosaic konfigurieren oder sich um EDID-Einstellungen kümmern, da Sie nicht über die GPU streamen. Allerdings muss die PTP-Zeitreferenz für jeden Knoten jederzeit gültig sein.
Damit diese Konfiguration funktioniert, ist der optionale Abschnitt über die PTP-Einrichtung, der in der Bereitstellungsphase erwähnt wurde, erforderlich.
Grundlagen der Konfiguration
Was die nDisplay-Konfiguration angeht, so ändert diese Funktion nicht, wie Sie das ICVFX-Kamera-Streaming konfigurieren. Stattdessen nutzt diese Funktion die Medien-Output-Konfiguration, die Sie auf dem Knoten-Level einrichten können, um den endgültigen Hintergrund-Buffer zu streamen, der von einem bestimmten Knoten gerendert wird. Sie müssen auch das Framelocking konfigurieren.
Bei der Konfiguration der Fenstergröße jedes Knotens kann es, je nach LED-Prozessor, der die Streams empfängt, zu Beschränkungen kommen. Wenn derselbe Prozessor zwei Streams empfängt, müssen beide Streams möglicherweise die gleiche Größe haben. So erzwingen Sie diese Beschränkung für denselben Beispielcluster, der zuvor beschrieben wurde.
Im Beispiel haben Sie drei Knoten zum Senden: Node_1, Node_2 und Node_3. Da Sie keine Beschränkungen in Bezug auf die Auflösung haben, können Sie das Knotenfenster so klein wie möglich halten, um die minimale Anzahl an erforderlichen Pixeln zu senden. In diesem Fall legen Sie die Fenster von Node_1 und Node_2 auf die gleiche Größe fest, indem Sie eine Beschränkung hinzufügen. Gehen Sie davon aus, dass sie denselben LED-Prozessor verwenden. Der Node_3-Stream hat diese Beschränkung nicht und hat nicht dieselbe Fenstergröße.
Knotenkonfiguration: Node_1 und Node_2
Beginnen Sie mit den Konfigurationen von Node_1 und Node_2. In der ursprünglichen Konfiguration:
Node_1 verwendet einen Vollbild-Knoten mit einer Fenstergröße von 7680 x 2160 und einem Viewport von 2640 x 1408.
Node_2 verwendet einen Vollbild-Knoten mit einer Fenstergröße von 3840 x 2160 und einem Viewport von 3344 x 1408.
Da der Viewport VP_W2 der größte ist, sollten Sie die Einstellungen für Node_1 und Node_2 identisch festlegen und die Größe von VP_W2 (3344 x 1408) verwenden.
Aktivieren Sie die Einstellung Monitorloses Rendering, um beide Knoten offscreen zu schalten, und deaktivieren Sie die Einstellung Vollbild.
Diese Änderung hat dem Stream von Node_1 einige zusätzliche Pixel hinzugefügt, um den Dimensionen des Streams von Node_2 zu entsprechen. Wenn Viewports nicht alle gleich sind, ist es wichtig zu berücksichtigen, wie sie pro Knoten organisiert sind, um keine Bandbreite zu verschwenden.
Konfigurieren Sie nun den Medien-Output der einzelnen Knoten. Medien können auf Knoten-Level (finaler Rückpuffer) und Viewport-Level konfiguriert werden. Es ist wichtig, diese Konfiguration auf dem Knoten vorzunehmen, um das finale zusammengesetzte und gewarpte Ergebnis zu senden.
Wählen Sie Node_1 aus und suchen Sie den Medienabschnitt:
Aktivieren Sie die Medien-Konfiguration:
Fügen Sie einen Medien-Output hinzu:
Konfigurieren Sie als Medien-Output den NVIDIA-Rivermax-Output, und konfigurieren Sie die Einstellungen entsprechend:
Ausrichtungsmodus: AlignmentPoint. Sie müssen Ihren Output mithilfe der PTP-Zeitreferenz an Genlock ausrichten, also muss Ihr Output an bekannte Ausrichtungspunkte gesendet werden.
Kontinuierlicher Output: True. Wurde ein Frame nicht rechtzeitig gerendert, muss der Output fortgesetzt werden und den vorherigen Frame wiederholen.
Framelocking-Modus: Blockieren zum Reservieren. Sie möchten vielleicht alle gerenderten Frames streamen:
Größe der Präsentationswarteschlange: 2. Eine doppelte Pufferung ist ideal, um die Latenz zu minimieren.
Anzahl der Textur-Buffer: 3. Es gibt keine strikten Anforderungen hierfür.
Auflösung: Nicht aktiviert. Sie müssen keine Auflösung erzwingen. Wenn Sie diese Option nicht aktivieren, wird ein Stream erstellt, der die Größe des Hintergrund-Buffers des Knotens verwendet.
Framerate: Projektabhängig. Das Beispiel verwendet 24 fps, aber in Ihrem Projekt könnte der Wert anders sein.
Pixelformat: RGB10. Dies kann für Ihr Projekt variieren und der Empfänger (LED-Prozessor) muss dieses Format unterstützen.
Interface-Adresse: 10.69.70.. In diesem Beispiel befinden sich alle Knoten im Subnetz 10.69.70., um das Ändern der Festlegung zu erleichtern, welcher Rechner welchen Knoten rendert. Die Verwendung eines Platzhalters für das letzte Oktett bedeutet, dass der ausgewählte Knoten in der Lage ist, seine lokale Interface-Adresse aufzulösen.
Stream-Adresse: Eindeutige Stream-Adresse für Node_1. Nutzen Sie für dieses Beispiel 225.1.2.1 und erhöhen Sie das letzte Oktett für jeden Knoten, um eine eindeutige Multicast-Adresse pro Knoten zu haben. Stellen Sie sicher, dass die hier verwendete Multicast-Gruppe nicht bereits in Ihrem Netzwerk verwendet wird, um Kollisionen zu vermeiden.
Port: 50000. Dieses Beispiel verwendet 50000 für alle Knoten und nur die Multicast-Adresse ändert sich.
GPUDirect verwenden: FALSE. Dies wird für den ST 2110-Output mit Framelock momentan nicht unterstützt.
Konfigurieren Sie die Erfassungs-Synchronisation für die Verwendung von Rivermax (PTP). Dies ermöglicht das Erzwingen von Framelocking im gesamten Cluster, indem eine Ethernet-Synchronisations-Barriere verwendet wird, die eine gemeinsame PTP-Zeitreferenz für den gesamten Cluster nutzt.
Spielraum (ms): 5. Verwenden Sie den Standardwert. Das ist ein Zeit-Spielraum, der referenziert wird, wenn der Knoten kurz vor dem Eintritt in die Erfassungs-Synchronisations-Barriere steht, also kurz bevor ein Frame für die Präsentation in die Warteschleife gestellt wird. Wenn erkannt wird, dass er zu nah am nächsten Ausrichtungspunkt ist (definiert durch den Spielraum), wird der Eintritt in die Barriere verzögert.
Zeitüberschreitung der Barriere (ms): 3000. Verwenden Sie den Standardwert. Dies ist eine Zeitüberschreitung zum Verlassen der Barriere, wenn nicht alle Knoten rechtzeitig beigetreten sind.
Die Konfiguration von Node_1 ist nun abgeschlossen und die Einstellungen sollten in etwa so aussehen:
Nachdem die Konfiguration von Node_1 abgeschlossen ist, können Sie nun mit der Konfiguration von Node_2 fortfahren. Seine Konfiguration sollte der von Node_1 entsprechen, mit Ausnahme der Stream-Adresse, die eindeutig sein muss.
Konfigurieren Sie die Einstellungen von Node_2 so, dass sie mit denen von Node_1 identisch sind.
Legen Sie die Stream-Adresse von Node_2 auf 225.1.2.2 fest.
Dies ist die finale Konfiguration von Node_2:
Knotenkonfiguration – Node_3
Konfigurieren Sie nun Node_3. Im oben beschriebenen Original-Beispiel war eine Lücke zwischen den beiden Viewports.
Um keinen Raum zu verschwenden, können Sie die Viewports so konfigurieren, dass die Lücke entfernt wird.
Konfigurieren Sie diesen Knoten dann, wie Sie es für Node_1 und Node_2 getan haben, als „Monitorlos“, und passen Sie seine Fenstergröße auf das Minimum an, das für beide Viewports erforderlich ist.
Anstatt 7680 x 2160 zu verwenden, setzen Sie die Fenstergröße auf 6336 x 1408.
Aktivieren Sie Monitorloses Rendering.
Konfigurieren Sie als Nächstes die Medien-Output-Konfiguration von Node_3. Auch hier sind die Einstellungen die gleichen wie für Node_1 und Node_2, mit Ausnahme der Stream-Adresse, die im Cluster eindeutig sein muss.
Konfigurieren Sie die Einstellungen von Node_3 so, dass sie mit denen von Node_1 und Node_2 identisch sind.
Legen Sie die Stream-Adresse von Node_3 auf 225.1.2.3 fest.
Nachdem die Konfiguration abgeschlossen ist, verwendet Ihr Cluster nun 5 Multicast-Gruppen:
225.1.1.10:50000 : ICVFXCameraA
225.1.1.11:50000 : ICVFXCameraB
225.1.2.1:50000: Node_1
225.1.2.2:50000: Node_2
225.1.2.3:50000: Node_3
Hier ist die finale Konfiguration von Node_3: