Das Rendering Hardware Interface (RHI) unterstützt nun asynchrones Berechnen (AsyncCompute) für Xbox One. Das ist eine gute Möglichkeit, um ungenutzte GPU-Ressourcen (Compute Units (CUs), Register und Bandbreite) zu nutzen, indem dispatch()-Aufrufe asynchron mit dem Rendering ausgeführt werden. Asynchrone Berechnung verwendet einen separaten Kontext und wir stellen RHI-Funktionen bereit, um den Rendering- und Berechnungskontext zu synchronisieren. Dr PIX ist nützlich, um Bereiche zu identifizieren, die von asynchroner Berechnung profitieren könnten. Wenn zum Beispiel die Hälfte der CUs während eines bestimmten Rendering-Durchlaufs ungenutzt bleibt, könnten diese CUs potenziell von einem asynchronen Job verwendet werden.
Asynchrone Berechnungen haben einige Einschränkungen:
Buffer mit UAV-Zählern werden nicht unterstützt (dies ist eine Einschränkung des XDK und erzeugt eine D3D-Warnung).
Asynchrone Berechnungsjobs werden in PIX GPU-Aufnahmen nicht angezeigt (obwohl sie in Zeiterfassungen erscheinen). PIX erfasst nur den unmittelbaren Kontext (dies ist eine Einschränkung der Plattform ).
Automatische Pipeline-Flushes werden vom Treiber nicht bereitgestellt. Sie müssen RHICSManualGpuFlush explizit aufrufen, wenn Flushes benötigt werden (z. B. wenn ein Dispatch vom vorherigen abhängig ist).
API
RHIBeginAsyncComputeJob_DrawThread (EAsyncComputePriority Priorität)
Startet einen asynchronen Berechnungsjob im Rendering-Thread. Die Priorität wird verwendet, um die Anzahl der Shader-Ressourcen zu bestimmen, die dem Job zugewiesen werden sollen (über ID3D11XComputeContext::SetLimits). Derzeit sind zwei Prioritäten verfügbar: AsyncComputePriority_High und AsyncComputePriority_Default.
RHIEndAsyncComputeJob_DrawThread
Beendet einen asynchronen Berechnungsjob. Gibt einen 32-Bit-Zaun-Index zurück, der für die Synchronisation verwendet werden kann, oder -1, wenn Berechnungen deaktiviert sind oder kein aktiver Job vorhanden ist.
RHIGraphicsWaitOnAsyncComputeJob
Fügt einen Befehl in den unmittelbaren Kontext ein, um zu blockieren, bis ein asynchroner Job abgeschlossen ist. Die Übergabe von -1 führt zu einem vorzeitigen Abbruch.
Zwischen Aufrufen von RHIBeginAsyncComputeJob_DrawThread und RHIEndAsyncComputeJob_DrawThread befindet sich das RHI im asynchronen Berechnungszustand. Während dieses Zeit werden unterstützte RHI-Befehle über den asynchronen Berechnungskontext ausgeführt. Nfür nicht unterstützte RHI-Funktionen wird assert ausgeführt.
Deaktivieren/Aktivieren
Asynchrone Berechnungen können beim Kompilieren aktiviert oder deaktiviert werden, indem Sie #define USE_ASYNC_COMPUTE_CONTEXT definieren. Dies kann mit der Konsolenvariable r.rdg.asynccompute zur Laufzeit deaktiviert werden. Wenn asynchrone Berechnung deaktiviert ist, werden Dispatches innerhalb von asynchronen Berechnungsblöcken synchron auf dem Grafik-Buffer ausgeführt. USE_ASYNC_COMPUTE_CONTEXT ist auf PC als 0 definiert, da es in D3D11.1 nicht unterstützt wird.
PIX
Asynchrone Berechnungskontext-Jobs werden nicht in GPU-Aufnahmen erfasst. Diese Aufnahmen können also ein irreführendes Bild der GPU-Performance vermitteln, wenn asynchrone Berechnung aktiviert ist. Zu Grafik-Debugging-Zwecken sollte die asynchrone Berechnung mit der oben genannten CVar deaktiviert werden. Asynchrone Berechnung wird von PIX-Zeiterfassungen unterstützt. Diese werden in der Zeitleiste folgendermaßen angezeigt:
Nachweis
Diese Funktion wurde von Lionhead Studios implementiert. Wir haben sie integriert und wollen sie als Werkzeug nutzen, um das Rendering auf der Xbox One zu optimieren.