Partager via


Choix d’une ressource

Une ressource est une collection de données utilisées 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 choisir les ressources requises par votre application.

Identifier les étapes de pipeline qui ont besoin de ressources

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

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

Phase de pipeline Entrée/Sortie Ressource Type de ressource
Assembleur d’entrée Dans Mémoire tampon de vertex Buffer
Assembleur d’entrée Dans Mémoire tampon d'index Buffer
Étapes du nuanceur Dans Shader-ResourceView Mémoire tampon, Texture1D, Texture2D, Texture3D
Étapes du nuanceur Dans Mémoire tampon de nuanceur-constante Buffer
Sortie de flux Out Buffer Buffer
Fusion de sortie Out Affichage de la cible de rendu Mémoire tampon, Texture1D, Texture2D, Texture3D
Fusion de sortie Out 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, autrement dit, si une ressource est accessible par l’UC 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, tenez compte du 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
Par défaut GPU rarement
Dynamique UC fréquemment
Staging GPU n/a
Non modifiable PROCESSEUR (uniquement au moment de la création des ressources) n/a

 

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

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 lors de l’exécution avec des données sur la géométrie visible du point de vue de l’utilisateur pour chaque image. Ces mémoires tampons seraient 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 depuis d’autres ressources. Un scénario classique consiste à copier des données dans une ressource avec une utilisation par défaut (que l’UC ne peut pas accéder) à une ressource avec une utilisation intermédiaire (auquel 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 regarder la même idée est de penser à ce qu’une application fait avec une ressource.

Utilisation de la ressource par l’application Utilisation des ressources
Charger une fois et ne jamais mettre à jour Immuable ou par défaut
L’application remplit la ressource à plusieurs reprises Dynamique
Render to Texture Par défaut
Accès processeur des données GPU Staging

 

Si vous n’êtes pas sûr de l’utilisation à choisir, commencez par l’utilisation par défaut, car elle est censée être le cas le plus courant. Une mémoire tampon shader-Constant est le type de ressource qui doit toujours avoir une utilisation par défaut.

Liaison de ressources aux phases de pipeline

Une ressource peut être liée à plusieurs phases de pipeline en même temps que les restrictions spécifiées lors de la création de la ressource sont remplies. Ces restrictions sont spécifiées en tant qu’indicateurs d’utilisation, indicateurs de liaison ou indicateurs d’accès 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 l’UC accèdent à la ressource. Les ressources conçues à un seul usage (n’utilisent pas plusieurs indicateurs d’utilisation, de liaison et d’accès au processeur) entraîneront plus que 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ée comme ressource de nuanceur. Chaque ressource n’utilise qu’un seul indicateur de liaison, indiquant « render target » ou « shader resource ». Les données sont copiées de la texture de la cible de rendu vers la texture du nuanceur.

Cette technique dans cet exemple peut améliorer les performances en isolant l’écriture de la cible de rendu à partir 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