La façon la plus performante d'organiser les données de sommet sur les GPU modernes

9

Dire que j'ai un modèle constitué de sommets, chacun avec position, normal, tangentet les texcoordattributs, où les triangles sont spécifiés par les triplets d'index.

Si nous nous concentrons uniquement sur les attributs des sommets, je connais deux grandes stratégies: la structure des tableaux et le tableau des structures. J'ai également entendu dire que le tableau de structures est préféré car il augmente la localité de mémoire (et donc la localité de cache) des attributs pour un sommet donné.

Est-ce vraiment le cas que cela améliore les performances? La principale façon dont je pourrais penser que cela se produirait est par les indices de sommet qui nécessitent que le rasterizer acquière des données de sommet qui ont depuis longtemps été expulsées du cache. Si l'accès aux données des sommets est aléatoire comme celui-ci, le fait de conserver tous les attributs d'un sommet sur la même ligne de cache accélérera certainement les choses, mais n'est-ce pas un problème qui pourrait être principalement atténué en optimisant l'ordre de spécification du triangle?

En outre, je crois comprendre que les GPU modernes peuvent être meilleurs pour décompresser de longs vecteurs du même type que des vecteurs de structures de nombreux types. Serait-il alors possible qu'une disposition de structure de tableaux surpasse systématiquement une disposition de tableau de structures des mêmes données de sommet, si l'ordre des index était optimisé?

lcmylin
la source
4
Ne pourriez-vous pas simplement l'essayer et voir lequel est le plus rapide pour votre cas?
user1118321
J'aurais pensé que pour les maillages indexés, les tableaux de structures seraient plus efficaces car le vertex shader sera alimenté avec tous les attributs de vertex, donc les regrouper en mémoire sera plus convivial pour le cache.
PaulHK
Selon les types de données dans la structure, les vec4 et les flotteurs s'assemblent bien, d'autres types pas si bien
PaulHK
2
@ user1118321 Bien que les expériences de benchmarking individuelles soient une pratique louable, il y a certainement plus de valeur à long terme dans une discussion théorique plus large et peut-être la mise en place résultante de pratiques générales basées sur le fonctionnement du matériel d'extraction de vertex.
Christian Rau

Réponses:

2

Toutes mes excuses, j'allais ajouter un commentaire à votre fil de questions, mais j'ai trouvé que je finissais par trop élaborer. Mon expérience de développement est dans une perspective DX 11, donc une partie de cela peut ne pas tenir dans OpenGL

La localité de mémoire des données joue certainement un rôle majeur. Mais il y a quelques autres éléments qui jouent dans cela, la largeur des données comme vous le savez. J'ai eu quelques GPU et mes performances ont été frappées par certains en fonction de certains points de basculement. C'est le cas par exemple, sur mon ancien AMD r290 si je me souviens bien, vous pouvez essentiellement passer jusqu'à 4 float4s au tampon vertex sans coût supplémentaire sur 1, mais une fois que j'ai posté> 4, il y a eu une baisse mesurable (dans le cadre taux). C'est purement hors de mon souvenir et c'est donc anecdotique au mieux. Mais il soutient que l'architecture GPU change tout le temps, et quelles techniques de niche qui vous donnent un avantage en termes de performances aujourd'hui, peut-être le fléau de vos performances demain. JE'

Cela dit, vous avez posé la question de l'ordre des sommets, et cela vous aidera certainement de façon marginale. Le gain de performances est lorsque vous combinez cela avec des tampons d'index qui permettent ensuite au matériel d'optimiser et de mettre en cache les sommets déjà calculés. Vous pouvez certainement obtenir encore plus de gains des bandes Triangle, etc., spécialement commandées selon vos pensées. La plupart des rendus de modèles que je fais sont des modèles optimisés basés sur des indices / sommets avec instanciation, j'utilise une petite quantité de recherches pour les effets de mouvement cyclique (branches d'arbre par exemple), dans ces cas, la branche entière de l'arbre recherche la même valeur. Ainsi, la mise en cache peut également être utilisée ici.

Tout ce que je peux dire en résumé de moi-même est:

  • Essayez de ne pas trop penser à l'optimisation au début, pendant que vous développez encore votre jeu / application, essayez de ne pas l'optimiser prématurément. Si vous devez revenir et ajouter de nouvelles fonctionnalités, vous risquez de perdre tout l'effort. Vous avez peut-être mon habitude> <, j'adore essayer d'obtenir les meilleures performances et techniques
  • Les architectures GPU sont variées et les forces de l'une peuvent refléter les faiblesses d'une autre. AMD et Nvidia sont connus pour obtenir des développeurs qu'ils optimisent les jeux à leur architecture, pour une raison, chacun a ses avantages / inconvénients. Prendre la voie du développement pourrait être le meilleur endroit, n'utilisez aucune fonctionnalité basée sur un fournisseur de matériel (avis ici). (ajouter à cela, certains formats emballés n'existent que dans AMD).

Ce ne sont que quelques réflexions et expériences que j'ai vécues. Il existe de nombreux livres sur lesquels vous devriez mettre la main sur ces sujets. Je n'ai pas vu beaucoup de gens prescrire ce que vous proposez, mais cela ne veut pas dire que c'est faux. Bonne chance.

ErnieDingo
la source
1

Cela peut dépendre du matériel cible et de l'API que vous allez utiliser. Pouvez-vous fournir plus d'informations? Voici quelques bonnes pratiques (très larges et générales) pour OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices

De plus, avez-vous un problème de performances? Ou êtes-vous simplement curieux.

i.terrible
la source