Entwurfsphilosophie von Befehlswarteschlangen und Befehlslisten
Die Ziele, die Wiederverwendung von Renderingarbeiten und der Multithreadskalierung zu ermöglichen, erforderten grundlegende Änderungen an der Art und Weise, wie Direct3D-Apps Rendering an die GPU übermitteln. In Direct3D 12 unterscheidet sich der Prozess der Übermittlung von Renderingarbeiten auf drei wichtige Weise von früheren Versionen:
- Beseitigung des unmittelbaren Kontexts. Dies ermöglicht Multithreading.
- Apps besitzen jetzt, wie Renderingaufrufe in GPU-Arbeitselemente (Graphics Processing Unit) gruppiert werden. Dies ermöglicht die Wiederverwendung.
- Apps steuern jetzt explizit, wann Arbeit an die GPU übermittelt wird. Dadurch werden die Elemente 1 und 2 aktiviert.
- Entfernen des unmittelbaren Kontexts
- Gruppierung von GPU-Arbeitselementen
- GPU-Arbeitsübermittlung
- Verwandte Themen
Entfernen des unmittelbaren Kontexts
Die größte Änderung von Microsoft Direct3D 11 zu Microsoft Direct3D 12 besteht darin, dass es keinen einzelnen, unmittelbaren Kontext mehr gibt, der einem Gerät zugeordnet ist. Zum Rendern erstellen Apps stattdessen Befehlslisten, in denen herkömmliche Rendering-APIs aufgerufen werden können. Eine Befehlsliste ähnelt der Rendermethode einer Direct3D 11-App, die den unmittelbaren Kontext verwendet, da sie Aufrufe enthält, die Primitive zeichnen oder den Renderingzustand ändern. Wie direkte Kontexte ist jede Befehlsliste nicht freethreads; es können jedoch mehrere Befehlslisten gleichzeitig aufgezeichnet werden, was moderne Multicoreprozessoren nutzt.
Befehlslisten werden in der Regel einmal ausgeführt. Eine Befehlsliste kann jedoch mehrmals ausgeführt werden, wenn die Anwendung sicherstellt, dass die vorherigen Ausführungen abgeschlossen sind, bevor neue Ausführungen übermittelt werden. Weitere Informationen zur Befehlslistensynchronisierung finden Sie unter Ausführen und Synchronisieren von Befehlslisten.
Gruppierung von GPU-Arbeitselementen
Zusätzlich zu Befehlslisten nutzt Direct3D 12 die Funktionen, die heute auf der gesamten Hardware vorhanden sind, indem eine zweite Ebene von Befehlslisten hinzugefügt wird, die als Bundles bezeichnet werden. Um diese beiden Typen zu unterscheiden, können die Befehlslisten der ersten Ebene als direkte Befehlslisten bezeichnet werden. Der Zweck von Bundles besteht darin, Apps das Gruppieren einer kleinen Anzahl von API-Befehlen für die spätere wiederholte Ausführung aus direkten Befehlslisten zu ermöglichen. Zum Zeitpunkt der Erstellung eines Bundles führt der Treiber so viel Vorverarbeitung wie möglich durch, um die spätere Ausführung effizient zu machen. Bundles können dann innerhalb mehrerer Befehlslisten und mehrmals innerhalb derselben Befehlsliste ausgeführt werden.
Die Wiederverwendung von Bundles ist ein großer Treiber für verbesserte Effizienz bei einzelnen CPU-Threads. Da Bundles vorab verarbeitet werden und mehrmals übermittelt werden können, gibt es bestimmte Einschränkungen für die Vorgänge, die innerhalb eines Bundles ausgeführt werden können. Weitere Informationen finden Sie unter Erstellen und Aufzeichnen von Befehlslisten und Bundles.
GPU-Arbeitsübermittlung
Zum Ausführen von Arbeiten an der GPU muss eine App explizit eine Befehlsliste an eine Befehlswarteschlange übermitteln, die dem Direct3D-Gerät zugeordnet ist. Eine direkte Befehlsliste kann mehrmals zur Ausführung übermittelt werden, aber die App ist dafür verantwortlich, sicherzustellen, dass die direkte Befehlsliste auf der GPU ausgeführt wurde, bevor sie erneut übermittelt wird. Bundles haben keine Einschränkungen für die gleichzeitige Verwendung und können mehrmals in mehreren Befehlslisten ausgeführt werden, aber Bundles können nicht direkt an eine Befehlswarteschlange zur Ausführung übermittelt werden.
Jeder Thread kann jederzeit eine Befehlsliste an jede Befehlswarteschlange übermitteln, und die Runtime serialisiert automatisch die Übermittlung der Befehlsliste in der Befehlswarteschlange, während die Übermittlungsreihenfolge beibehalten wird.