Sofortiges und verzögertes Rendering

Direct3D 11 unterstützt zwei Arten von Rendering: direkt und verzögert. Beide werden mithilfe der ID3D11DeviceContext-Schnittstelle implementiert.

Sofortiges Rendering

Sofortiges Rendering bezieht sich auf das Aufrufen von Rendering-APIs oder -Befehlen von einem Gerät, das die Befehle in einem Puffer zur Ausführung auf der GPU in die Warteschlange einreiht. Verwenden Sie einen unmittelbaren Kontext zum Rendern, Festlegen des Pipelinezustands und Wiedergeben einer Befehlsliste.

Erstellen Sie mithilfe von D3D11CreateDevice oder D3D11CreateDeviceAndSwapChaineinen unmittelbaren Kontext.

Verzögertes Rendering

Beim verzögerten Rendering werden Grafikbefehle in einem Befehlspuffer aufgezeichnet, sodass sie zu einem anderen Zeitpunkt wiedergegeben werden können. Verwenden Sie einen verzögerten Kontext, um Befehle (Rendering und Zustandseinstellung) in einer Befehlsliste aufzuzeichnen. Verzögertes Rendering ist ein neues Konzept in Direct3D 11. Das verzögerte Rendering ist so konzipiert, dass das Rendering in einem Thread unterstützt wird, während Befehle zum Rendern in zusätzlichen Threads aufgezeichnet werden. Mit dieser parallelen Multithreadstrategie können Sie komplexe Szenen in gleichzeitige Aufgaben aufgliedern. Weitere Informationen zum Rendern komplexer Szenen finden Sie unter Multiple-Pass Rendering.

Erstellen Sie mit id3D11Device::CreateDeferredContexteinen verzögerten Kontext.

Direct3D generiert Renderingaufwand, wenn Befehle im Befehlspuffer in die Warteschlange eingereiht werden. Im Gegensatz dazu wird eine Befehlsliste während der Wiedergabe viel effizienter ausgeführt. Um eine Befehlsliste zu verwenden, zeichnen Sie Renderingbefehle mit einem verzögerten Kontext auf und wiedergeben sie mithilfe eines unmittelbaren Kontexts.

Sie können nur eine einzelne Befehlsliste auf Singlethread-Weise generieren. Sie können jedoch mehrere verzögerte Kontexte gleichzeitig erstellen und verwenden, jeweils in einem separaten Thread. Anschließend können Sie diese mehreren verzögerten Kontexte verwenden, um gleichzeitig mehrere Befehlslisten zu erstellen.

Sie können nicht zwei oder mehr Befehlslisten gleichzeitig im unmittelbaren Kontext wiedergeben.

Rufen Sie ID3D11DeviceContext::GetTypeauf, um zu bestimmen, ob es sich bei einem Gerätekontext um einen unmittelbaren oder verzögerten Kontext handelt.

Die ID3D11DeviceContext::Map-Methode wird nur in einem verzögerten Kontext für dynamische Ressourcen (D3D11 _ USAGE _ DYNAMIC) unterstützt, wobei der erste Aufruf in der Befehlsliste D3D11 _ MAP WRITE _ _ DISCARDist. D3D11 _ MAP _ WRITE _ NO _ OVERWRITE wird bei nachfolgenden Aufrufen unterstützt, sofern für den angegebenen Ressourcentyp verfügbar.

Abfragen in einem verzögerten Kontext sind auf die Datengenerierung und prädikatierte Zeichnung beschränkt. Sie können ID3D11DeviceContext::GetData nicht für einen verzögerten Kontext aufrufen, um Daten zu einer Abfrage abzurufen. Sie können GetData nur im unmittelbaren Kontext aufrufen, um Daten zu einer Abfrage abzurufen. Sie können ein Renderingprädikat (einen Abfragetyp) festlegen, indem Sie D3D11DeviceContext::SetPredication aufrufen, um Abfrageergebnisse auf der GPU zu verwenden. Sie können Abfragedaten durch Aufrufe von ID3D11DeviceContext::Begin und ID3D11DeviceContext::Endgenerieren. Die Abfragedaten sind jedoch erst verfügbar, wenn Sie ID3D11DeviceContext::ExecuteCommandList im unmittelbaren Kontext aufrufen, um die Befehlsliste des verzögerten Kontexts zu übermitteln. Die Abfragedaten werden dann von der GPU verarbeitet.

Multithreading