l'optimisation d'un moteur 3d est différent de l'optimisation d'un programme lambda.
les goulots sont liés au principe de la 3d.
donc fo:
1) chercher à éliminer ce qui n'est pas visible dans le champ de vision (tests par rapport au frustrum), ou caché par d'autres objets (portals de vision / d'occlusion), etc etc..
c'est d'abord l'architecture et l'organisation des structures qui priment (quake3 utilise une table PVS donnant la visiblité zone par zone pour rejeter rapidement ce qui n'est pas dans le champ de vision, ou caché, et se sert d'un arbe BSP pour calculer les collisions rapidement)
2) une fois que tu ne traçes que ce qui est "nécessaire", il faut traçer -rapidement-, pour cela:
a) rien d'autres que du vertex buffer+index buffer
b) on limite les changements d'états, on gros en réuni les primitives qui ont les mêmes propriétés matériaux/tetxures dans le même bloc
c) pour de bonnes performances géométriques, le flux d'index doit être optimisé vis à vis du cache Post Tnl (et Post Vertex Shader c'est le même).
en gros les triangles indépendants partageant les mêmes vertices doivent être traçés de manière contigu afin le cache Post Tnl fasse son office.
de la même manière une fois que l'index buffer est organisé de manière correcte, tu peux aussi réorganiser le vertex buffer afin que les vertexs utilisés ensemble soient contigus.
exemple:
flux non optimisé:
triangle 1 vertexs 64,63,60
triangle 2 vertexs 800,802,806
triangle 3 vertexs 65,64,7800
....
....
triangle 16, vertexs 0,1,8
triangle 17, vertexs 800,803,802
triangle 18, vertexs 7800,64,812
....
....
....
triangle 500, vertexs 0,1,2
triangle 501, vertexs 800,802,799
triangle 502, vertexs 7800,812,3
triangle 504, vertexs 64,812,200
....
....
flux optimisé au niveau index buffer (cache Post Tnl friendly):
triangle 1, vertexs 64,63,60 // 3 v transformés (1)
triangle 2, vertexs 65,64,7800 // 2 v transformés (3)
triangle 3, vertexs 7800,64,812 // 1 v transformé (18)
triangle 4, vertexs 7800,812,3 // 1 v transformé (502)
...
...
...
etc etc..
donc là on un flux optimal pour le cache post Tnl, car on a un réutilisation de vertexs déjà transformés.
flux optimisé index buffer & vertexbuffer (cache Post Tnl & cache "général" friendly):
on remappe les vertexs afin qu'ils soient contigus en espace mémoire:
64=>1
63=>2
60=>3
65=>4
7800=>5
812=>6
3=>7
ce qui donne au niveau index buffer:
triangle 1, vertexs 1,2,3
triangle 2, vertexs 4,1,5
triangle 3, vertexs 5,1,6
triangle 4, vertexs 5,6,7
...
...
...
les données du vertex buffer doivent donc être "défragmentées"
on fonction de la table idéale.
ces optimisations des données est aussi valable en opengl, les pratiques sont les mêmes.
edit: j'avais dit une bêtise pour quake 3
Message édité par bjone le 07-10-2006 à 20:34:28