Introduction au multithreading dans Direct3D 11

Le multithreading est conçu pour améliorer les performances en effectuant un travail à l’aide d’un ou plusieurs threads en même temps.

Dans le passé, cela a souvent été effectué en générant un thread main unique pour le rendu et un ou plusieurs threads pour effectuer des travaux de préparation tels que la création d’objets, le chargement, le traitement, etc. Toutefois, avec la synchronisation intégrée dans Direct3D 11, l’objectif de la multithreading est d’utiliser chaque cycle d’UC et de GPU sans faire attendre un processeur pour un autre processeur (en particulier ne pas faire attendre le GPU, car il a un impact direct sur la fréquence d’images). Ce faisant, vous pouvez générer la plus grande quantité de travail tout en conservant la meilleure fréquence d’images. Le concept d’une image unique pour le rendu n’est plus nécessaire, car l’API implémente la synchronisation.

La multithreading nécessite une certaine forme de synchronisation. Par exemple, si plusieurs threads qui s’exécutent dans une application doivent accéder à un seul contexte d’appareil (ID3D11DeviceContext), cette application doit utiliser un mécanisme de synchronisation, tel que des sections critiques, pour synchroniser l’accès à ce contexte d’appareil. Cela est dû au fait que le traitement des commandes de rendu (généralement effectué sur le GPU) et la génération des commandes de rendu (généralement effectuées sur le processeur par le biais de la création d’objets, du chargement des données, du changement d’état, du traitement des données) utilisent souvent les mêmes ressources (textures, nuanceurs, état du pipeline, etc.). L’organisation du travail sur plusieurs threads nécessite une synchronisation pour empêcher un thread de modifier ou de lire des données qui sont modifiées par un autre thread.

Bien que l’utilisation d’un contexte d’appareil (ID3D11DeviceContext) ne soit pas thread-safe, l’utilisation d’un appareil Direct3D 11 (ID3D11Device) est thread-safe. Étant donné que chaque ID3D11DeviceContext est à thread unique, un seul thread peut appeler un ID3D11DeviceContext à la fois. Si plusieurs threads doivent accéder à un seul ID3D11DeviceContext, ils doivent utiliser un mécanisme de synchronisation, comme des sections critiques, pour synchroniser l’accès à cet ID3D11DeviceContext. Toutefois, plusieurs threads ne sont pas nécessaires pour utiliser des sections critiques ou des primitives de synchronisation pour accéder à un seul ID3D11Device. Par conséquent, si une application utilise ID3D11Device pour créer des objets de ressource, cette application n’est pas tenue d’utiliser la synchronisation pour créer plusieurs objets de ressources en même temps.

La prise en charge du multithreading divise l’API en deux domaines fonctionnels distincts :

Les performances de multithreading dépendent de la prise en charge du pilote. Guide pratique pour vérifier la prise en charge du pilote fournit plus d’informations sur l’interrogation du pilote et la signification des résultats.

Direct3D 11 a été conçu à partir de la base pour prendre en charge le multithreading. Direct3D 10 implémente une prise en charge limitée de la multithreading à l’aide de la couche thread-safe. Cette page répertorie les différences de comportement entre les deux versions de DirectX : Différences de thread entre les versions direct3D.

Multithreading et DXGI

Un seul thread à la fois doit utiliser le contexte immédiat. Toutefois, votre application doit également utiliser ce même thread pour les opérations DXGI (Microsoft DirectX Graphics Infrastructure), en particulier lorsque l’application effectue des appels à la méthode IDXGISwapChain::P resent .

Notes

Il n’est pas valide d’utiliser un contexte immédiat simultanément avec la plupart des fonctions d’interface DXGI. Pour les kits de développement logiciel (SDK) DirectX de mars 2009 et ultérieurs, les seules fonctions DXGI qui sont sécurisées sont AddRef, Release et QueryInterface.

 

Pour plus d’informations sur l’utilisation de DXGI avec plusieurs threads, consultez Considérations multithread.

Traitement multithread