janvier 25, 2021

Quelle est la différence entre DirectX 11 et DirectX 12 ?

Par elmunster

DirectX 12 a fait ses débuts il y a deux ans, promettant des performances significatives et une amélioration générale de la latence. Cela inclut une meilleure utilisation du processeur, un accès plus proche du métal ainsi qu’une multitude de nouvelles fonctionnalités, notamment le ray-tracing ou DXR (DirectX Ray-tracing). Mais qu’est-ce que DirectX 12 exactement et en quoi est-il différent de DirectX 11. Voyons un peu.

Qu’est-ce que DirectX : c’est une API

Comme Vulkan et OpenGL, DirectX est une API qui vous permet d’exécuter des jeux vidéo sur votre ordinateur. Toutefois, contrairement à ses homologues, DX est une plate-forme propriétaire de Microsoft et ne prend en charge que Windows. OpenGL et Vulkan, en revanche, fonctionnent sur Mac ainsi que sur Linux.

directx12

Maintenant, que fait une API graphique comme DirectX ? Elle agit comme un intermédiaire entre le moteur de jeu et les pilotes graphiques, qui à leur tour interagissent avec le noyau du système d’exploitation. Une API graphique est une plate-forme où la conception et les mécanismes du jeu sont compris. Pensez-y comme à MS Paint où le jeu est la peinture et l’application de peinture est l’API. Cependant, contrairement à Paint, le programme de sortie d’une API graphique n’est lisible que par l’API utilisée pour le concevoir. En général, une API est conçue pour un système d’exploitation spécifique. C’est la raison pour laquelle les jeux PS4 ne fonctionnent pas sur la Xbox One et vice versa.

DirectX 12 Ultimate est la première API graphique qui enfreint cette règle. Elle sera utilisée sur Windows ainsi que sur la prochaine génération de Xbox Series X. Avec DX12 Ultimate, MS intègre essentiellement les deux plates-formes.

 

 

DirectX 11 contre DirectX 12 : Que signifie ce système pour les joueurs sur PC ?

L’API DirectX 12 présente trois avantages principaux pour les joueurs sur PC :

Une meilleure mise à l’échelle avec les processeurs multi-cœurs

L’un des principaux avantages des API de bas niveau comme DirectX 12 et Vulkan est l’amélioration de l’utilisation du CPU. Traditionnellement, dans les jeux basés sur DirectX 9 et 11, la plupart des jeux n’utilisaient que 2 à 4 cœurs pour les différentes mécaniques : Physique, IA, appel à la concurrence, etc. Certains jeux étaient même limités à un seul. Avec DirectX 12, cela a changé. La charge est plus uniformément répartie sur tous les cœurs, ce qui rend les processeurs multi-cœurs plus pertinents pour les joueurs.

Utilisation maximale du matériel

Beaucoup d’entre vous ont peut-être remarqué qu’au début, les GPU AMD privilégiaient les titres DirectX 12 plutôt que les pièces concurrentes de NVIDIA. Pourquoi en est-il ainsi ?

La raison est une meilleure utilisation. Traditionnellement, NVIDIA a toujours bénéficié d’une meilleure prise en charge des pilotes, alors que le matériel AMD a toujours souffert de son manque. DirectX 12 ajoute de nombreuses technologies pour améliorer l’utilisation, comme le calcul asynchrone qui permet d’exécuter simultanément plusieurs étapes du pipeline (lire : Calcul et graphique). Le manque de support des pilotes est donc un problème moins pressant.

Plus proche du soutien au métal

Un autre avantage majeur de DirectX 12 est que les développeurs ont plus de contrôle sur la façon dont leur jeu utilise le matériel. Auparavant, ce contrôle était plus abstrait et était principalement assuré par les pilotes et l’API (bien que certains moteurs comme Frostbyte et Unreal fournissent également des outils de bas niveau).

La tâche incombe maintenant aux développeurs. Ils ont un accès plus proche du métal, ce qui signifie que la plupart des responsabilités en matière de rendu et d’allocation des ressources sont assumées par les moteurs de jeu avec l’aide des pilotes graphiques.

C’est une arme à double tranchant car il existe de nombreuses architectures GPU dans la nature et pour les développeurs indépendants, il est impossible d’optimiser leur jeu pour tous. Heureusement, les moteurs tiers comme Unreal, CryEngine et Unity le font pour eux et ils n’ont qu’à se concentrer sur la conception.

Comment DirectX 12 améliore les performances en optimisant l’utilisation du matériel

Là encore, il existe trois grandes avancées en matière d’API qui facilitent ce gain :

Objets de l’État du pipeline

Dans DirectX 11, les objets dans le pipeline GPU existent dans un large éventail d’états tels que le Vertex Shader, le Hull Shader, le Geometry Shader, etc. Ces états sont parfois interdépendants les uns des autres et le prochain état successif ne peut pas progresser si l’état précédent n’est pas défini.

Chacun des objets dans DirectX 11 doit être défini individuellement (à l’exécution) et l’état suivant ne peut pas être exécuté avant que le précédent ne soit finalisé car ils nécessitent des unités matérielles différentes (shaders vs ROPs, TMU, etc). ). Le matériel est donc sous-utilisé, ce qui entraîne une augmentation des frais généraux et une réduction des appels d’offres.

DirectX 12 remplace les différents états par des Pipeline State Objects (PSO) qui sont finalisés lors de la création même. Ces PSO comprennent le bytecode de tous les shaders, y compris les shaders de sommet, de pixel, de domaine, de coque et de géométrie, et peuvent être convertis en n’importe quel état selon les besoins sans dépendre d’un autre objet ou état. Les PSO peuvent être commutés dynamiquement d’un registre à l’autre en transférant une petite quantité de données.

Les GPU NVIDIA Turing, avec l’aide de DirectX 12, introduisent les Task Shaders et les Mesh Shaders. Ces deux nouveaux shaders remplacent les différents niveaux de shaders encombrants du pipeline DX11 pour une approche plus flexible.

Le shader de maillage effectue la même tâche que les shaders de domaine et de géométrie, mais en interne, il utilise un modèle multi-fil plutôt qu’un modèle monofil. Le task shader fonctionne de manière similaire. La principale différence ici est que si l’entrée du shader de coque est constituée de patchs et la sortie de l’objet tesselé, l’entrée et la sortie du task shader sont définies par l’utilisateur.

Dans la scène ci-dessous, il y a des milliers d’objets qui doivent être rendus. Dans le modèle traditionnel, chacun d’entre eux nécessiterait un appel de dessin unique de la part de l’unité centrale. Cependant, avec le task shader, une liste d’objets utilisant un seul appel de dessin est envoyée. Le task shader traite ensuite cette liste en parallèle et attribue le travail au mesh shader (qui fonctionne également de manière synchrone), après quoi la scène est envoyée au rasterizer pour la conversion 3D-D2.

Cette approche permet de réduire considérablement le nombre d’appels de dessin du processeur par scène, ce qui augmente le niveau de détail.

Les shaders de maillage facilitent également l’élimination des triangles inutilisés. Cette opération est réalisée à l’aide du shader d’amplification. Il fonctionne avant le shader de maillage et détermine le nombre de groupes de fils de shaders de maillage nécessaires. Ils testent les différents maillages pour les intersections possibles et la visibilité de l’écran, puis effectuent l’élimination requise. L’élimination de la géométrie à ce stade précoce du rendu améliore considérablement les performances.

File d’attente des commandes

Avec DirectX 11, il n’y a qu’une seule file d’attente pour le GPU. Cela conduit à une répartition inégale de la charge sur les différents cœurs des processeurs, ce qui a pour effet de paralyser les processeurs multi-filaires.

Cette situation est quelque peu atténuée par l’utilisation d’un contexte différé, mais même dans ce cas, il n’y a finalement qu’un seul flux de commandes menant à l’unité centrale au stade final. DirectX 12 introduit un nouveau modèle qui utilise des listes de commandes qui peuvent être exécutées indépendamment, ce qui augmente le multithreading. Il s’agit notamment de diviser la charge de travail en commandes plus petites nécessitant des ressources différentes, ce qui permet une exécution simultanée. C’est ainsi que le calcul asynchrone fonctionne en divisant les commandes de calcul et les commandes graphiques en files d’attente séparées et en les exécutant simultanément.

Assignation des ressources

Dans DirectX 11, la liaison des ressources était très abstraite et pratique, mais pas la meilleure en termes d’utilisation du matériel. Elle laissait de nombreux composants matériels inutilisés ou inactifs. La plupart des moteurs de jeu utilisaient des « objets de vue » pour allouer les ressources et les lier à divers niveaux de shaders du pipeline GPU.

Les objets seraient liés à des fentes le long du pipeline au moment du tirage et les shaders en tireraient les données nécessaires. L’inconvénient de ce modèle est que lorsque le moteur de jeu a besoin d’un ensemble différent de ressources, les liaisons sont inutiles et doivent être réattribuées.

DirectX 12 remplace les vues des ressources par des tas de descripteurs et des tableaux. Un descripteur est un petit objet qui contient des informations sur une ressource. Ces informations sont regroupées pour former des tableaux de descripteurs qui sont à leur tour stockés dans un tas.

Idéalement, un tableau descriptif stocke des informations sur un type de ressource tandis qu’un tas contient tous les tableaux nécessaires au rendu d’une ou plusieurs images. Le pipeline GPU accède à ces données en se référant à l’index de la table des descripteurs.

Comme le tas de descripteurs contient déjà les données descriptives requises, si un ensemble différent de ressources est nécessaire, la table des descripteurs est commutée, ce qui est beaucoup plus efficace que de réassembler les ressources à partir de zéro.

D’autres fonctionnalités sont fournies avec DirectX 12 :

Ombrage à taux variable : L’ombrage à taux variable permet au GPU de se concentrer sur les zones de l’écran qui sont plus « visibles » et affectées par image. Dans le cas d’un tireur, il s’agit de l’espace autour du réticule. En revanche, la zone autour du bord de l’écran est la plupart du temps floue et peut être ignorée (dans une certaine mesure).

Cela permet aux développeurs de se concentrer davantage sur les zones qui affectent réellement la qualité visuelle apparente (le centre du cadre dans la plupart des cas) tout en réduisant l’ombrage en périphérie.

Le SRV est de deux types : Content Adaptive Shading et Motion Adaptive Shading :

Le CAS permet l’ombrage individuel de chacune des tuiles d’écran 16×16 (rendu en mosaïque), ce qui permet au GPU d’augmenter le taux d’ombrage dans les régions qui se distinguent tout en les réduisant dans le reste.

L’ombrage adaptatif de mouvement est tel qu’il paraît. Il augmente le taux d’ombrage des objets en mouvement (en changeant chaque image) tout en réduisant celui des objets relativement statiques. Dans le cas d’un jeu de course, la voiture aura un ombrage accru tandis que le ciel et les régions hors route auront une priorité réduite.

Support multi-GPU : DirectX 12 prend en charge deux types de support multi-GPU, à savoir implicite et explicite. Implicite est essentiellement SLI/XFX et laisse le travail au pilote du vendeur. L’explicite est plus intéressant et permet au moteur de jeu de contrôler le fonctionnement parallèle des deux GPU. Cela permet une meilleure mise à l’échelle et un meilleur mélange des différents GPU, même ceux de différents fournisseurs (y compris votre dGPU et iGPU).

Un autre avantage majeur est que les images VRAM des deux GPU ne sont pas réfléchies et peuvent être empilées pour doubler la mémoire vidéo. Cette caractéristique et une tonne d’autres font de DirectX 12 une mise à jour majeure du côté logiciel des jeux sur PC.
DirectX 12 Ultimate : En quoi est-il différent de DirectX 12 ?

DirectX 12 Ultimate est une mise à jour incrémentielle par rapport à DirectX 12 existant (niveau 1.1). Son principal avantage est le support multi-plateforme : La prochaine génération de la série Xbox X ainsi que les derniers jeux PC en tireront parti. Cela simplifie non seulement le portage multiplateforme, mais permet également aux développeurs d’optimiser plus facilement leurs jeux pour les derniers matériels.

D’ici à ce que la Xbox Series X arrive plus tard dans l’année, les développeurs de jeux auront déjà eu assez de temps avec du matériel utilisant la même API graphique (Turing de NVIDIA), ce qui simplifiera le processus de portage et d’optimisation. En même temps, cela permettra également une meilleure utilisation du matériel PC le plus récent, améliorant ainsi les performances. Dans l’ensemble, il s’agit d’une nouvelle étape franchie par Microsoft pour unifier les plates-formes de jeu Xbox et PC.

A part cela, il introduit DirectX Raytracing 1.1, Sampler Feedback, Mesh Shaders, et Variable Rate Shading. Les deux derniers étaient déjà pris en charge par les GPU RTX Turing de NVIDIA (et sont expliqués ci-dessus) mais ils seront désormais largement adoptés par les jeux et les développeurs les plus récents.

Feedback sur les échantillons de texture : La sclérose en plaques est un sujet sur lequel la SEP insiste beaucoup. En termes simples, il garde une trace des textures (MIP Maps) qui sont affichées dans le jeu et qui ne le sont pas. Par conséquent, les textures non utilisées sont expulsées de la mémoire, ce qui se traduit par un bénéfice net pouvant atteindre 2,5 fois l’utilisation globale de la VRAM. Sur l’image ci-dessus, vous pouvez voir, à droite (sans TSF), que toutes les ressources de texture du globe sont chargées dans la mémoire. Avec TSF sur la gauche, seule la partie réellement visible à l’écran est conservée tandis que les bits inutilisés sont supprimés, ce qui permet d’économiser une précieuse mémoire.

Cela peut également être fait à travers les images (temporellement). Dans une image relativement statique, les objets au loin peuvent réutiliser l’ombrage sur plusieurs trames, par exemple, sur chacune des deux à quatre trames et même plus. Les performances graphiques enregistrées peuvent être utilisées pour améliorer la qualité des objets ou des lieux proches qui ont un impact plus apparent sur la qualité.

DXR 1.1 est une mise à jour mineure par rapport à la version 1.0 existante :

Le raytracing est maintenant entièrement contrôlé par le GPU et ne nécessite pas d’appels de tirage du CPU, ce qui réduit la surcharge du CPU et améliore les performances.
De nouveaux shaders de raytracing peuvent être chargés au fur et à mesure des besoins, en fonction de la localisation du joueur dans le monde du jeu.
Le raytracing en ligne est l’un des principaux ajouts à DirectX 12 Ultimate. Il permet aux développeurs de mieux contrôler le processus de traçage de rayons. Il est disponible à n’importe quel stade du processus de rendu et est possible dans les cas où la complexité des ombres est minimale.