Quand ce sont des Organisations sises à vienne plus rapide que le “simple” primitives OpenGL (glBegin())?

Après de nombreuses années d'audience sur les Vertex Buffer Objects (Organisations), j'ai finalement décidé d'expérimenter avec eux (mon stuff n'est généralement pas critique pour les performances, bien évidemment...)

Je vais vous décrire mon expérience ci-dessous, mais pour faire une longue histoire courte, je vais voir indiscernables de performances entre une "simple" mode direct (glBegin()/glEnd()), vertex array (CPU) et de la VBO (GPU côté) les modes de rendu. J'essaie de comprendre pourquoi, et dans quelles conditions dois-je m'attendre à voir les Organisations de manière significative audace de leur primitive (pun intended) ancêtres.

Expérience De Détails

Pour l'expérience, j'ai généré un (statique) 3D Gaussienne cloud d'un grand nombre de points. Chaque point a de vertex & la couleur de l'information associée. Ensuite, j'ai fait pivoter la caméra autour du cloud dans les trames successives dans une sorte de "orbite" de comportement. Encore une fois, les points sont statiques, que l'œil se déplace (via gluLookAt()). Les données sont générées avant tout rendu & stockés dans deux tableaux pour une utilisation dans la boucle de rendu.

Pour le rendu direct, l'ensemble des données est rendue dans un seul glBegin()/glEnd() bloc avec une boucle contenant un appel unique à chaque glColor3fv() et glVertex3fv().

Pour les vertex array et VBO rendu, l'ensemble des données est rendue avec un seul glDrawArrays() de l'appel.

Ensuite, j'ai simplement l'exécuter pendant une minute dans une boucle serrée, et de mesurer la moyenne des FPS avec la haute performance de la minuterie.

Résultats De Performance ##

Comme mentionné ci-dessus, la performance a été impossible de distinguer à la fois sur mon ordinateur de bureau (XP x64, 8 GO de RAM, 512 MO Quadro fx 1700), et mon ordinateur portable (XP32, 4 go de ram, 256 MO de Quadro NVS 110). Il n'échelle comme prévu avec le nombre de points, cependant. Évidemment, j'ai aussi désactivé le vsync.

De résultats spécifiques de l'ordinateur portable fonctionne (rendu w/GL_POINTS):

glBegin()/glEnd():

  • 1K pts --> 603 FPS
  • 10K pts --> 401 FPS
  • 100K pts --> 97 FPS
  • 1M de pts --> 14 FPS

Vertex Arrays (CPU côté):

  • 1K pts --> 603 FPS
  • 10K pts --> 402 FPS
  • 100K pts --> 97 FPS
  • 1M de pts --> 14 FPS

Vertex Buffer Objects (GPU côté):

  • 1K pts --> 604 FPS
  • 10K pts --> 399 FPS
  • 100K pts --> 95 FPS
  • 1M de pts --> 14 FPS

J'ai rendu les mêmes données avec GL_TRIANGLE_STRIP et a obtenu de la même façon indiscernable (bien que plus lent que prévu en raison supplémentaire de pixellisation). Je peux poster ces chiffres trop si quelqu'un les veut.
.

Question(s)

  • Ce qui donne?
  • Que dois-je faire pour réaliser la promesse de gain de performance des Organisations?
  • Ce qui me manque?
  • Peut-être que nVidia pilotes sont l'optimisation de choses derrière ton dos? Le problème, c'est qu'il est impossible de tester que dans l'isolement...
  • Cette pensée m'est apparu ainsi. J'ai aussi pensé que peut-être Quadro vs GeForce (c'est à dire le professionnel vs carte de joueur) pourrait avoir quelque chose à faire avec elle.
  • Comment peuvent-ils optimiser la glBegin()/glEnd() version? @Timide: par curiosité, pourquoi avez-vous de modifier la question? @Drew Hall: Pourriez-vous poster le programme ou la source quelque part? J'aimerais l'essayer (et peut-être regarder les nuages, pour une minute ou deux.)
  • Désolé, j'aimerais bien, mais je ne peux pas poster le code. Je vais voir si je peux poster un exécutable ou d'au moins une capture d'écran quelque part.
  • Hall: Jamais l'esprit, fini par construire un moi-même 🙂
  • Coller le code qui fait le tirage au sort - le glBegin() et tout en haut jusqu'à ce que le glEnd () et le code qui crée les Organisations sises à vienne. Il serait agréable de connaître le fond de cette, peu importe de quel âge il est.
  • Est le VBO générés une fois par image ou une fois au début du programme? Je m'attends à voir ces résultats si vous étiez le rechargement de la VBO (via glBufferData()) à chaque image.
  • Une fois, au début du programme.

InformationsquelleAutor Drew Hall | 2009-01-10