la création de 11 textures directx programme, les avantages et les inconvénients des trois méthodes différentes

StackOverflow https://stackoverflow.com/questions/6347950

  •  27-10-2019
  •  | 
  •  

Question

La href="http://msdn.microsoft.com/en-us/library/ff476905%28v=vs.85%29.aspx"> msdn explique que dans directx 11 il sont multiples façons de remplir une texture directx 11 programme:

(1) créer la texture avec la texture d'utilisation par défaut et l'initialiser avec des données de la mémoire

(2) Créer la texture avec l'utilisation de la dynamique, utilisez DeviceContext carte pour obtenir un pointeur vers la mémoire de texture, écrire, puis utilisez Unmap pour indiquer que vous avez terminé (à quel point je suppose qu'il est copié dans le gpu)

(3) Créer la texture avec la mise en scène d'utilisation et suivez mêmes étapes que pour la texture dynamique, mais suivre que par un appel à ID3D11DeviceContext.CopyResource d'utiliser cette texture de la mise en scène dans fill tour un (non immuable) par défaut ou la texture dynamique.

Toutefois, la documentation n'explique pas les avantages et les inconvénients de chaque méthode du tout, et je suis encore assez nouveau pour directx, il est donc pas du tout clair pour moi.

Quels sont les avantages et les inconvénients de chacune de ces façons de créer une texture programme dans directx 11?

Note Side: Je l'ai lu dans le contexte de la mise en scène des textures, lire retour du gpu n'est pas en mémoire tampon de sorte que vous devez faire votre propre tampon double. Mais je ne sais pas si cela était exact et si elle applique à l'écriture en utilisant des textures de mise en scène (ou même pas vraiment ce que cela signifie).

remarque Deuxième: La documentation de la méthode carte indique qu'il obtient un pointeur vers les données dans un sous-ressource et refuse l'accès GPU à cette sous-ressource. Lorsque le GPU veut accéder à une texture dont les données sous-jacente a été appelé par carte, que fait-il? Stalle? (Je demande parce que cela ressemble à une partie des avantages et des inconvénients que j'enquis)

Était-ce utile?

La solution

La bonne réponse dépend de ce que vous allez utiliser la texture pour. Ces trois options sont différentes façons d'obtenir des données de la CPU dans la texture. Si cela est un RenderTarget, vous généralement pas de fournir des données initiales de la CPU, de sorte que vous pouvez les ignorer: créer la texture, et quand vous êtes prêt à rendre ce (peut-être clair () uant premier)

Donc en supposant que vous avez des données dans la mémoire de l'application que vous souhaitez entrer dans la texture:

Si cela est juste une texture statique (je veux dire la texture est lu de beaucoup plus qu'il est écrit), alors vous voulez une texture USAGE_DEFAULT ou USAGE_IMMUTABLE. Ceux-ci sont généralement optimisés pour les performances de lecture GPU par rapport à USAGE_DYNAMIC. Si vous avez les données à portée de main lorsque vous créez la texture, puis l'option (1) est plus facile, utilise le moins la mémoire intermédiaire, et DX11 le transfert de données vers le GPU peut être fait sur un thread séparé de votre fil de rendu. Si vous ne disposez pas des données au moment où vous créez la texture, l'utilisation UpdateSubresource () ou de l'option (3) pour fournir les données lorsque vous l'avez.

Si c'est une texture dynamique, ce qui signifie que vous fournissez un nouveau contenu de la CPU fréquemment (lecture vidéo sur l'unité centrale est le cas canonique: les données sont fournies par le CPU une fois par trame, puis lu par le GPU une fois par image), vous veulent probablement utiliser USAGE_DYNAMIC et de l'option (2). textures USAGE_DYNAMIC sont optimisés pour le streaming de données de la CPU vers le GPU plutôt que simplement pour les lectures GPU. Les détails (et les implications de performance) varient selon les fournisseurs de matériel, mais le plus souvent que vous voulez utiliser uniquement USAGE_DYNAMIC si vous êtes vraiment le streaming de données du CPU vers le GPU, plutôt que simplement parce qu'il est un moyen pratique de charger des données statiques à l'avance.

Option (3) est plus spécialisée, et peut être utilisé soit pour la charge initiale de données dans une texture statique (réutilisation de la surface de mise en scène (s) de chargement de données pour de nombreuses textures) ou des flux de données pour une utilisation relativement dynamique. Il vous donne un contrôle précis sur la synchronisation GPU / CPU et sur la mémoire intermédiaire utilisée pour les transferts. Généralement, vous utiliserez un anneau de tampons mise en scène, et D3D11_MAP_FLAG_DO_NOT_WAIT pour vérifier si chaque tampon est encore utilisé par un CopyResource précédent. Je considère que cette option d'experts - si vous ne faites pas attention, vous pouvez faire du mal en empêchant mal perf de la CPU et le GPU de fonctionner de manière asynchrone

.

La divulgation complète. Travail que je le pilote D3D chez Nvidia, mais ce sont mes opinions personnelles

scroll top