Sofortiges und verzögertes Rendering

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

Sofortiges Rendern

Direktes Rendern bezieht sich auf das Aufrufen von Rendering-APIs oder -Befehlen von einem Gerät, das die Befehle in einem Puffer für die Ausführung auf der GPU in die Warteschlange stellt. Verwenden Sie einen unmittelbaren Kontext, um eine Befehlsliste zu rendern, den Pipelinestatus festzulegen und wiederzugeben.

Erstellen Sie einen unmittelbaren Kontext mit D3D11CreateDevice oder D3D11CreateDeviceAndSwapChain.

Verzögertes Rendering

Das verzögerte Rendering zeichnet Grafikbefehle in einem Befehlspuffer auf, 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. verzögertes Rendern ist so konzipiert, dass das Rendern in einem Thread beim Aufzeichnen von Befehlen für das Rendern in zusätzlichen Threads unterstützt wird. Mit dieser parallelen Multithreadstrategie können Sie komplexe Szenen in gleichzeitige Aufgaben aufteilen. Weitere Informationen zum Rendern komplexer Szenen finden Sie unter Rendering mit mehreren Durchlaufs.

Erstellen Sie mithilfe von ID3D11Device::CreateDeferredContext einen verzögerten Kontext.

Direct3D generiert Renderingaufwand, wenn Befehle im Befehlspuffer in die Warteschlange gestellt 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 geben Sie sie mithilfe eines unmittelbaren Kontexts wieder.

Sie können nur eine einzelne Befehlsliste in Singlethreads generieren. Sie können jedoch mehrere verzögerte Kontexte gleichzeitig erstellen und verwenden, jeweils in einem separaten Thread. Anschließend können Sie diese mehrere 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::GetType auf, um festzustellen, 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, bei denen der erste Aufruf in der Befehlsliste D3D11_MAP_WRITE_DISCARD wird. 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ädiktische Zeichnung beschränkt. Id3D11DeviceContext::GetData kann nicht in einem verzögerten Kontext aufgerufen werden, 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 (eine Art von Abfrage) festlegen, indem Sie D3D11DeviceContext::SetPredication aufrufen, um Abfrageergebnisse auf der GPU zu verwenden. Sie können Abfragedaten durch Aufrufe von ID3D11DeviceContext::Begin und ID3D11DeviceContext::End generieren. 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