Partager via


Choix d’une ressource (Direct3D 10)

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 couvre 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 de pipeline 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 étapes 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ées à chaque étape de pipeline. Il indique si la ressource peut être liée en tant qu’entrée ou sortie, ainsi que l’API de liaison.

Phase de pipeline Entrée/Sortie Ressource Type de ressource API de liaison
Assembleur d'entrée Dans Tampon de vertex Buffer IASetVertexBuffers
Assembleur d'entrée Dans Mémoire tampon d’index Buffer IASetIndexBuffer
Étapes du nuanceur Dans Shader-ResourceView Tampon, Texture1D, Texture2D, Texture3D VSSetShaderResources, GSSetShaderResources, PSSetShaderResources
Étapes du nuanceur Dans mémoire tampon Shader-Constant Buffer VSSetConstantBuffers, GSSetConstantBuffers, PSSetConstantBuffers
Flux de sortie Sortie Buffer Buffer SOSetTargets
Fusion de sortie Sortie Affichage cible de rendu Tampon, Texture1D, Texture2D, Texture3D OMSetRenderTargets
Fusion de sortie Sortie Vue profondeur/gabarit Texture1D, Texture2D OMSetRenderTargets

 

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 donc les ressources dont chaque étape aura besoin), l’étape suivante consiste à déterminer la façon dont 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 (voir D3D10_USAGE).

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 les 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 tampons de vertex et d’index dynamiques qui seraient remplis 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 le processeur peut accéder).

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

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

Utilisation de la ressource par l’application 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 à la 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 elle est censée être le 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 (indicateurs d’utilisation, indicateurs deliaison, indicateurs d’accès au processeur) sont remplies. Plus spécifiquement, 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înent 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 (D3D10_BIND_RENDER_TARGET ou D3D10_BIND_SHADER_RESOURCE). Les données sont copiées de la texture cible de rendu vers la texture du nuanceur à l’aide de CopyResource ou copySubresourceRegion. Cela peut améliorer les performances en isolant l’écriture de la cible de rendu de la lecture de la texture du nuanceur. Bien sûr, 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 (Direct3D 10)