Render Dependency Graph (RDG)

Aus UnrealWiki

Hinweis: Stand: Unreal Engine 5.8. Dieser Artikel fasst die aktuelle offizielle Epic-Dokumentation zusammen.

Der Render Dependency Graph (RDG, auch Render Graph) organisiert Renderarbeit als Graph aus Passes und Ressourcen. Ein Pass ist ein Arbeitsschritt auf CPU/GPU; Ressourcen sind vor allem Texturen und Buffer. Statt Übergänge, Lebensdauer und Synchronisation überall von Hand zu steuern, beschreibt der Code, welche Ressourcen ein Pass liest oder schreibt. RDG leitet daraus die Reihenfolge ab.

Warum RDG?

RDG kann unbenutzte Passes entfernen, temporäre Ressourcen nur so lange wie nötig halten, Speicher zwischen nicht gleichzeitig lebenden Ressourcen wiederverwenden und Barrieren automatisch setzen. Es unterstützt außerdem Async Compute und paralleles Aufzeichnen von Command Lists. Das senkt Fehlergefahr und kann CPU-, GPU- und Speicherarbeit besser überlappen.

Das Grundmodell

  1. Ein FRDGBuilder sammelt Passes und Ressourcen für den Graphen.
  2. Texturen oder Buffer werden im Graphen erzeugt oder als externe Ressourcen registriert.
  3. Parameterstrukturen nennen die Eingaben und Ausgaben eines Passes. Daraus erkennt RDG echte Abhängigkeiten.
  4. AddPass fügt die auszuführende Arbeit hinzu.
  5. Execute() kompiliert den Graphen, entfernt tote Arbeit und führt die verbleibenden Passes aus.

Ein RDG-Handle wie FRDGTextureRef ist kein dauerhaft frei nutzbares RHI-Objekt. Seine Gültigkeit richtet sich nach dem Graphen. Soll ein Ergebnis außerhalb weiterleben, muss es über die dafür vorgesehenen Extract-/External-Mechanismen übergeben werden.

Kleines C++-Muster

FRDGTextureDesc Desc = FRDGTextureDesc::Create2D(
    Extent, PF_FloatRGBA, FClearValueBinding::Black,
    TexCreate_ShaderResource | TexCreate_UAV);

FRDGTextureRef Output = GraphBuilder.CreateTexture(Desc, TEXT("MyOutput"));

FMyShader::FParameters* Parameters =
    GraphBuilder.AllocParameters<FMyShader::FParameters>();
Parameters->Output = GraphBuilder.CreateUAV(Output);

FComputeShaderUtils::AddPass(
    GraphBuilder,
    RDG_EVENT_NAME("MyComputePass"),
    ComputeShader,
    Parameters,
    GroupCount);

Entscheidend ist nicht die genaue Shaderlogik, sondern dass Parameters den Schreibzugriff auf Output sichtbar macht. Versteckte Ressourcen-Zugriffe außerhalb der Parameterstruktur verhindern korrekte Planung und Validierung.

Praxisregeln

  • Ressourcen-Zugriffe vollständig in den Passparametern deklarieren.
  • RDG-Ressourcen nicht über ihre vorgesehene Lebensdauer hinaus speichern.
  • Pass-Lambdas nur mit Daten füttern, die bei ihrer späteren Ausführung noch gültig sind.
  • Seiteneffekte vermeiden: Ein Pass ohne sichtbaren Beitrag kann entfernt werden. Notwendige Sonderfälle müssen bewusst mit passenden Pass-Flags modelliert werden.
  • Ereignisnamen mit RDG_EVENT_NAME vergeben; das macht Captures und RDG Insights lesbar.
  • Erst messen, dann optimieren. RDG Insights visualisiert Graph, Abhängigkeiten und Ressourcenlebensdauer.

Bezug: UE5 Heterogeneous Multi-GPU

Für Jans Projekt ist RDG die passende Ebene, um Abhängigkeiten zwischen GPU-Arbeit explizit zu machen. Das ist eine Voraussetzung für kontrollierte Überlappung und Synchronisation. RDG verteilt einen Pass jedoch nicht automatisch auf unterschiedliche oder heterogene GPUs.

Die GPU-Auswahl liegt tiefer in RHI und Multi-GPU-Code, unter anderem über FRHIGPUMask. Für einen Prototyp sollten deshalb drei Fragen getrennt geprüft werden:

  • Ist der RDG-Graph fachlich korrekt und frei von versteckten Abhängigkeiten?
  • Welche Passes und Ressourcen dürfen auf welcher GPU liegen?
  • Wo entstehen explizite Cross-GPU-Kopien und Synchronisationskosten?

RDG Insights hilft bei der ersten Frage. Für GPU-Zuordnung, Transfers und Adapter-Fähigkeiten sind zusätzlich RHI-Quellcode, Plattform-RHI und GPU-Captures nötig.

Quellen