Partager via


Choix d’une ressource

Une ressource est une collection de données utilisée par le pipeline 3D. La création de ressources et la définition de leur comportement constituent la première étape de la programmation de votre application. Ce guide traite des rubriques de base pour le choix des ressources requises par votre application.

Identifier les étapes de pipeline qui ont besoin de ressources

La première étape consiste à choisir la ou les phases du pipeline graphique qui utiliseront une ressource. Autrement dit, identifiez chaque étape qui lit les données d’une ressource, ainsi que les phases qui écrivent les données dans une ressource. Connaître les phases de pipeline où les ressources seront utilisées détermine les API qui seront appelées pour lier la ressource à la phase.

Ce tableau répertorie les types de ressources qui peuvent être liés à chaque étape de pipeline. Elle indique si la ressource peut être liée en tant qu’entrée ou sortie.

Étape de pipeline Entrée/Sortie Ressource Type de ressource
Assembleur d'entrée Dans Tampon de vertex Buffer
Assembleur d'entrée Dans Mémoire tampon d’index Buffer
Étapes du nuanceur Dans Shader-ResourceView Buffer, Texture1D, Texture2D, Texture3D
Étapes du nuanceur Dans mémoire tampon Shader-Constant Buffer
Sortie du flux Sortie Buffer Buffer
Fusion de sortie Sortie Affichage de la cible de rendu Buffer, Texture1D, Texture2D, Texture3D
Fusion de sortie Sortie Vue Profondeur/Gabarit Texture1D, Texture2D

 

Identifier la façon dont chaque ressource sera utilisée

Une fois que vous avez choisi les étapes de pipeline que votre application utilisera (et par conséquent les ressources dont chaque étape aura besoin), l’étape suivante consiste à déterminer comment chaque ressource sera utilisée, c’est-à-dire si une ressource est accessible par le processeur ou le GPU.

Le matériel sur lequel votre application s’exécute aura au moins un processeur et un GPU. Pour choisir une valeur d’utilisation, déterminez le type de processeur qui doit lire ou écrire dans la ressource à partir des options suivantes.

Utilisation des ressources Peut être mis à jour par Fréquence de mise à jour
Default GPU Rarement
Dynamique UC Fréquemment
Staging GPU n/a
Non modifiable PROCESSEUR (uniquement au moment de la création de la ressource) n/a

 

L’utilisation par défaut doit être utilisée pour une ressource qui est censée être mise à jour par le processeur rarement (moins d’une fois par image). Dans l’idéal, le processeur n’écrit jamais directement dans une ressource avec une utilisation par défaut afin d’éviter des pénalités de performances potentielles.

L’utilisation dynamique doit être utilisée pour une ressource que le processeur met à jour relativement fréquemment (une ou plusieurs fois par image). Un scénario classique pour une ressource dynamique consiste à créer des mémoires tampons de vertex et d’index dynamiques qui seraient remplies au moment de l’exécution avec des données sur la géométrie visibles du point de vue de l’utilisateur pour chaque image. Ces mémoires tampons sont utilisées pour afficher uniquement la géométrie visible par l’utilisateur pour ce cadre.

L’utilisation intermédiaire doit être utilisée pour copier des données vers et à partir d’autres ressources. Un scénario classique consiste à copier des données dans une ressource avec une utilisation par défaut (à laquelle le processeur ne peut pas accéder) vers une ressource avec une utilisation intermédiaire (à laquelle l’UC peut accéder).

Les ressources immuables doivent être utilisées lorsque les données de la ressource ne changeront jamais.

Une autre façon de considérer la même idée consiste à penser à ce qu’une application fait avec une ressource.

Comment l’application utilise la ressource Utilisation des ressources
Charger une seule fois et ne jamais mettre à jour Immuable ou par défaut
L’application remplit la ressource à plusieurs reprises Dynamique
Rendu en texture Default
Accès processeur des données GPU Staging

 

Si vous ne savez pas quelle utilisation choisir, commencez par l’utilisation par défaut, car il s’agit probablement du cas le plus courant. Une mémoire tampon Shader-Constant est le seul type de ressource qui doit toujours avoir une utilisation par défaut.

Liaison de ressources à des phases de pipeline

Une ressource peut être liée à plusieurs étapes de pipeline en même temps tant que les restrictions spécifiées lors de la création de la ressource sont respectées. Ces restrictions sont spécifiées en tant qu’indicateurs d’utilisation, indicateurs de liaison ou indicateurs d’accès au processeur. Plus précisément, une ressource peut être liée en tant qu’entrée et sortie simultanément, tant que la lecture et l’écriture d’une partie d’une ressource ne peuvent pas se produire en même temps.

Lors de la liaison d’une ressource, réfléchissez à la façon dont le GPU et le processeur accèdent à la ressource. Les ressources conçues dans un seul but (n’utilisent pas plusieurs indicateurs d’utilisation, de liaison et d’accès au processeur) entraîneront probablement de meilleures performances.

Par exemple, considérez le cas d’une cible de rendu utilisée comme texture plusieurs fois. Il peut être plus rapide d’avoir deux ressources : une cible de rendu et une texture utilisées comme ressource de nuanceur. Chaque ressource utilise un seul indicateur de liaison, indiquant « cible de rendu » ou « ressource de nuanceur ». Les données sont copiées de la texture cible de rendu vers la texture du nuanceur.

Dans cet exemple, cette technique peut améliorer les performances en isolant l’écriture de la cible de rendu de la lecture de texture du nuanceur. La seule façon d’être sûr est d’implémenter les deux approches et de mesurer la différence de performances dans votre application particulière.

Ressources