Dire que j'ai un modèle constitué de sommets, chacun avec position
, normal
, tangent
et les texcoord
attributs, 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é?
la source
Réponses:
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:
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.
la source
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.
la source