Einführung in das Multithreading in Direct3D 11

Multithreading wurde entwickelt, um die Leistung zu verbessern, indem Arbeit mit einem oder mehreren Threads gleichzeitig ausgeführt wird.

In der Vergangenheit wurde dies häufig durch Generieren eines einzelnen Standard Threads zum Rendern und eines oder mehrerer Threads für vorbereitungsbereite Aufgaben wie Objekterstellung, Laden, Verarbeiten usw. durchgeführt. Mit der integrierten Synchronisierung in Direct3D 11 besteht das Ziel des Multithreadings jedoch darin, jeden CPU- und GPU-Zyklus zu nutzen, ohne dass ein Prozessor auf einen anderen Prozessor wartet (insbesondere nicht, dass die GPU wartet, da es sich direkt auf die Framerate auswirkt). Auf diese Weise können Sie den größten Arbeitsaufwand generieren und gleichzeitig die beste Bildfrequenz beibehalten. Das Konzept eines einzelnen Frames für das Rendern ist nicht mehr so notwendig, da die API die Synchronisierung implementiert.

Multithreading erfordert eine Form der Synchronisierung. Wenn beispielsweise mehrere Threads, die in einer Anwendung ausgeführt werden, auf einen einzelnen Gerätekontext (ID3D11DeviceContext) zugreifen müssen, muss diese Anwendung einen Synchronisierungsmechanismus verwenden, z. B. kritische Abschnitte, um den Zugriff auf diesen Gerätekontext zu synchronisieren. Dies liegt daran, dass bei der Verarbeitung der Renderbefehle (in der Regel auf der GPU) und beim Generieren der Renderbefehle (in der Regel auf der CPU durch Objekterstellung, Laden von Daten, Zustandsänderungen, Datenverarbeitung) häufig die gleichen Ressourcen (Texturen, Shader, Pipelinestatus usw.) verwendet werden. Die Organisation der Arbeit über mehrere Threads hinweg erfordert eine Synchronisierung, um zu verhindern, dass ein Thread Daten ändert oder liest, die von einem anderen Thread geändert werden.

Während die Verwendung eines Gerätekontexts (ID3D11DeviceContext) nicht threadsicher ist, ist die Verwendung eines Direct3D 11-Geräts (ID3D11Device) threadsicher. Da jeder ID3D11DeviceContext single threaded ist, kann jeweils nur ein Thread id3D11DeviceContext aufrufen. Wenn mehrere Threads auf einen einzelnen ID3D11DeviceContext zugreifen müssen, müssen sie einen Synchronisierungsmechanismus verwenden, z. B. kritische Abschnitte, um den Zugriff auf diesen ID3D11DeviceContext zu synchronisieren. Mehrere Threads müssen jedoch keine kritischen Abschnitte oder Synchronisierungsgrundtypen verwenden, um auf ein einzelnes ID3D11Device zuzugreifen. Wenn eine Anwendung id3D11Device zum Erstellen von Ressourcenobjekten verwendet, muss diese Anwendung daher keine Synchronisierung verwenden, um mehrere Ressourcenobjekte gleichzeitig zu erstellen.

Die Multithreadingunterstützung unterteilt die API in zwei verschiedene Funktionsbereiche:

Die Multithreadingleistung hängt von der Treiberunterstützung ab. Vorgehensweise: Überprüfen auf Treiberunterstützung enthält weitere Informationen zum Abfragen des Treibers und zur Bedeutung der Ergebnisse.

Direct3D 11 wurde von Grund auf entwickelt, um Multithreading zu unterstützen. Direct3D 10 implementiert eingeschränkte Unterstützung für Multithreading mithilfe der threadsicheren Ebene. Auf dieser Seite werden die Verhaltensunterschiede zwischen den beiden Versionen von DirectX aufgeführt: Threadingunterschiede zwischen Direct3D-Versionen.

Multithreading und DXGI

Nur jeweils ein Thread sollte den unmittelbaren Kontext verwenden. Ihre Anwendung sollte jedoch auch denselben Thread für DXGI-Vorgänge (Microsoft DirectX Graphics Infrastructure) verwenden, insbesondere wenn die Anwendung die IDXGISwapChain::P resent-Methode aufruft .

Hinweis

Es ist ungültig, einen unmittelbaren Kontext gleichzeitig mit den meisten DXGI-Schnittstellenfunktionen zu verwenden. Für die DirectX SDKs vom März 2009 und höher sind addRef, Release und QueryInterface die einzigen DXGI-Funktionen, die sicher sind.

 

Weitere Informationen zur Verwendung von DXGI mit mehreren Threads finden Sie unter Überlegungen zu Multithreads.

Multithreading