Après avoir entendu parler pendant de nombreuses années des Vertex Buffer Objects (VBO), j'ai finalement décidé de les expérimenter (mon travail n'est normalement pas critique en termes de performances, évidemment...).
Je vais décrire mon expérience ci-dessous, mais pour faire court, je constate que les performances sont indiscernables entre le mode direct "simple" (glBegin()/glEnd()), les modes de rendu vertex array (côté CPU) et VBO (côté GPU). J'essaie de comprendre pourquoi et dans quelles conditions je peux m'attendre à voir les VBO surpasser de manière significative leurs ancêtres primitifs (jeu de mots).
Détails de l'expérience
Pour l'expérience, j'ai généré un nuage gaussien 3D (statique) d'un grand nombre de points. Chaque point est associé à des informations de vertex et de couleur. Puis j'ai fait tourner la caméra autour du nuage dans des images successives dans une sorte de comportement "orbital". Encore une fois, les points sont statiques, seul l'oeil bouge (via gluLookAt()). Les données sont générées une fois avant tout rendu et stockées dans deux tableaux pour être utilisées dans la boucle de rendu.
Pour le rendu direct, l'ensemble des données est rendu dans un seul bloc glBegin()/glEnd() avec une boucle contenant un seul appel à glColor3fv() et glVertex3fv().
Pour le rendu des tableaux de sommets et des VBO, l'ensemble des données est rendu avec un seul appel glDrawArrays().
Ensuite, je l'exécute simplement pendant une minute environ dans une boucle serrée et je mesure le nombre moyen d'images par seconde avec le chronomètre haute performance.
Résultats des performances ###
Comme mentionné ci-dessus, les performances étaient indiscernables sur mon ordinateur de bureau (XP x64, 8 Go de RAM, 512 Mo de Quadro 1700) et sur mon ordinateur portable (XP32, 4 Go de RAM, 256 Mo de Quadro NVS 110). Il a cependant évolué comme prévu avec le nombre de points. Évidemment, j'ai également désactivé vsync.
Résultats spécifiques de l'ordinateur portable (rendu avec GL_POINTS) :
glBegin()/glEnd() :
- 1K pts --> 603 FPS
- 10K pts --> 401 FPS
- 100K pts --> 97 FPS
- 1M pts --> 14 FPS
Vertex Arrays (côté CPU) :
- 1K pts --> 603 FPS
- 10K pts --> 402 FPS
- 100K pts --> 97 FPS
- 1M pts --> 14 FPS
Vertex Buffer Objects (côté GPU) :
- 1K pts --> 604 FPS
- 10K pts --> 399 FPS
- 100K pts --> 95 FPS
- 1M pts --> 14 FPS
J'ai rendu les mêmes données avec GL_TRIANGLE_STRIP et j'ai obtenu des résultats similaires (bien que plus lents comme prévu en raison de la rastérisation supplémentaire). Je peux aussi poster ces chiffres si quelqu'un les veut. .
Question(s)
- Qu'est-ce qui se passe ?
- Que dois-je faire pour réaliser le gain de performance promis par les VBO ?
- Qu'est-ce que je rate ?