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.
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup de facteurs à optimiser le rendu 3D.
habituellement, il y a 4 goulots d'étranglement:
Votre test est de donner des résultats faussés parce que vous avez beaucoup de CPU (et bus), tout en optimisant les vertex ou un pixel de débit. Des organisations sises à vienne sont utilisées pour abaisser le CPU (moins d'appels de l'api, parallèle à l'UC transferts DMA). Puisque vous n'êtes pas dépendant du PROCESSEUR, ils ne vous donnent aucun gain. C'est de l'optimisation 101. Dans un jeu par exemple CPU devient précieux car il est nécessaire pour d'autres choses comme de l'IA et la physique, pas seulement pour la délivrance des tonnes d'appels d'api. Il est facile de voir que l'écriture de vertex (3 chars par exemple) directement à un pointeur de la mémoire est beaucoup plus rapide que d'appeler une fonction qui écrit 3 flotteurs pour la mémoire à tout le moins, vous enregistrez les cycles de l'appel.
Il pourrait y avoir quelques choses qui manquent:
C'est une je devine, mais votre ordinateur portable carte peut être manquant dans ce genre d'opération à tous (c'est à dire l'émulation c').
Êtes-vous de copier les données sur GPU, de la mémoire (via
glBufferData
(GL_ARRAY_BUFFER
soit avecGL_STATIC_DRAW
ouGL_DYNAMIC_DRAW
param) ou êtes-vous à l'aide du pointeur à main (non, GPU) tableau dans la mémoire? (qui exige la copie de chaque image et, par conséquent, la performance est faible)Vous êtes de passage indices comme un autre tampon envoyé par
glBufferData
etGL_ELEMENT_ARRAY_BUFFER
params?Si ces trois choses sont faites, le gain de performance est grande.
Pour Python (v/pyOpenGl) c'est environ 1000 fois plus rapide sur les tableaux plus gros qu'un couple de 100 elemnts,
C++ jusqu'à 5 fois plus rapide, mais sur les tableaux 50k-10m sommets.
Voici mes résultats de test pour c++ (Core2Duo/8600GTS):
De sorte que même avec 10m de sommets, il était normal de framerate alors qu'avec glB/e, il est lent.
À partir de la lecture du Livre Rouge, je me souviens d'un passage qui a déclaré que les Organisations sises à vienne sont peut-être plus rapidement en fonction du matériel. Certains matériels optimise ceux, tandis que d'autres ne le font pas. Il est possible que votre matériel ne fonctionne pas.
14Mpoints/s n'est pas un lot entier. C'est suspect. peut-on voir le code complet de faire le dessin, ainsi que l'initialisation ? (comparer 14M/s à 240 M/s (!) que Slava Vishnyakov obtient). C'est d'autant plus suspect qu'il descend à 640 ko/s pour 1K de tirage (par rapport à son 3,8 M/s, c'est pas plafonné par le ~3800 SwapBuffers, de toute façon).
Je serais beting le test ne mesure pas ce que vous pensez des mesures.
En supposant que je me souviens de ce droit, mon OpenGL enseignant, qui est bien connu dans l'OpenGL de la communauté, dit qu'ils sont plus rapides sur la géométrie statique qui va être rendu beaucoup de temps sur un match, ce sera des tables président et les petites entités statiques.