La Performance de WebGL et OpenGL
Pour le mois passé j'ai été déconner avec WebGL, et a constaté que si je créer et de dessiner un grand vertex buffer elle provoque des FPS bas. Personne ne sait si c'est la même chose si j'ai utilisé OpenGL en C++?
Est qu'un goulot d'étranglement avec le langage (JavaScript dans le cas de WebGL) ou le GPU?
WebGL des exemples comme ça montrent que l'on peut tirer de 150 000 cubes à l'aide d'un tampon avec de bonnes performances, mais rien de plus que cela, je reçois des gouttes FPS. Serait-ce la même chose avec OpenGL, ou serait-il capable de gérer une grande mémoire tampon?
Fondamentalement, ce que j'ai à prendre une décision de poursuivre l'aide de WebGL et essayer d'optimiser par code ou - si vous me dites OpenGL plus performant et c'est une langue goulot d'étranglement de vitesse, interrupteur de C++ et utiliser OpenGL.
OriginalL'auteur Joey Morani | 2013-07-07
Vous devez vous connecter pour publier un commentaire.
Si vous avez un seul drawArrays appel, il ne devrait pas y avoir de différence entre OpenGL et WebGL pour l'appel lui-même. Toutefois, la définition des données en Javascript pourrait être beaucoup plus lent, donc, cela dépend vraiment de votre problème. Si la majeure partie de vos données est statique (paysage, chambres), WebGL pourrait bien fonctionner pour vous. Sinon, le réglage des données dans le JS peut-être trop lent pour votre but. Cela dépend vraiment de votre problème.
p.s. Si vous incluez plus de détails de ce que vous essayez de le faire, vous obtiendrez probablement plus détaillées /réponses précises.
OriginalL'auteur Stefan Haustein
Pour l'anecdote, j'ai écrit une mosaïque de jeu dans le début des années 2000 à l'aide de l'ancien
glVertex()
API de style qui s'est parfaitement bien déroulé. J'ai récemment commencé à le porter à WebGL etglDrawArrays()
et maintenant sur mon PC moderne qui est au moins 10 fois plus rapide, il devient terrible de la performance.La raison semble en être que je faisait semblant d'être un appel à aller
glBegin(GL_QUADS); glVertex()*4; glEnd();
en utilisantglDrawArrays()
. À l'aide deglDrawArrays()
pour dessiner un polygone est beaucoup plus lente en WebGL que de faire la même chose avecglVertex()
était en C++.Je ne sais pas pourquoi. Peut-être que c'est parce que le javascript est chien lent. Peut-être que c'est à cause de certains changements de contexte les questions en javascript. De toute façon, je ne peux que faire autour de 500 d'un polygone
glDrawArray()
appels tout en continuant à 60 FPS.Tout le monde semble contourner ceci en faire autant sur le GPU que possible, et de faire que quelques
glDrawArray()
appels par image possible. Si vous pouvez faire cela dépend de ce que vous essayez de tracer. Dans l'exemple de cubes liés qu'ils peuvent faire tout sur le GPU, y compris le déplacement de l'cubes, ce qui est pourquoi il est rapide. Essentiellement, ils triché - généralement WebGL applications risquent de ne pas être comme ça.Google eu une conversation où ils ont expliqué cette technique (ils ont aussi trop de calculer le mouvement des objets sur le GPU): https://www.youtube.com/watch?v=rfQ8rKGTVlg
Ouais c'est ce que j'ai fait. Malheureusement en streaming à un VBO est également assez lent - au moins, il semble plus lent que je me souviens
glBegin()
. Si vous pouvez l'éviter en streaming, alors il est très rapide, mais cela dépend de l'application.OriginalL'auteur Timmmm
OpenGL est plus souple et plus optimisé en raison de la plus récente version de l'api utilisée.
Il est vrai, si vous dites que OpenGL est plus rapide et plus capable, mais il dépend aussi de vos besoins.
Si vous avez besoin d'un cube de maille avec de la texture, webGL serait suffisant. Toutefois, si vous avez l'intention de construire de grands projets à grande échelle avec beaucoup de sommets, le post-traitement des effets et des différentes techniques de rendu (et le type de déplacement, parallax mapping, per-vertex ou peut-être de pavage) puis OpenGL peut-être un meilleur et plus sage de choix en fait.
L'optimisation des tampons pour un seul appel, l'optimisation de la mise à jour de ceux-ci peuvent être fait, mais il a ses limites, bien sûr, et oui, OpenGL serait probablement effectuer mieux de toute façon.
Pour y répondre, il n'est pas un langue goulot d'étranglement, mais un api-version utilisée.
WebGL est basé sur OpenGL ES, ce qui a des avantages mais aussi des pistes un peu plus lent et il a plus de niveaux d'abstraction pour le code de la manipulation que de la pure OpenGL a, et c'est une raison pour baisser les performances de plus, le code doit être évalué.
Si votre projet ne nécessite pas de solution basée sur le web, et n'est pas en charge les périphériques pris en charge, puis OpenGL serait un meilleur et plus intelligent choix.
Espère que cette aide.
En fait javascript est plutôt rapide avec les mathématiques et à proximité d'un code C compilé. J'ai un moteur 3D intégré à la fois dans WebGL/OpenGL et je suis encore à trouver une différence appréciable. J'ai testé une immense terrain de grille d'environ 256x256 (hfz terrain) dans les deux, le chargement et les performances du rendu entre les ordinateurs de bureau OpenGL/ES et il n'en est pas vraiment une différence.
Le problème avec le javascript est l'Appel de la Fonction de la surcharge et de déplacer les données dans la mémoire ( plus rapide avec tapé/native de tableaux mais qui n'est pas utilisé assez souvent en js) est BEAUCOUP plus élevé dans C de sorte que le nombre de tracer les appels doivent être réduites au minimum .Un maillage unique est grande , 1000 objets sont beaux en C mais pas en js.
OriginalL'auteur Abstract Algorithm
WebGL est beaucoup plus lent sur le même matériel par rapport à l'équivalent d'OpenGL, en raison de la forte entendu pour chaque WebGL appel.
Sur le bureau OpenGL, cette surcharge de travail est au moins limité, si encore relativement coûteux.
Mais dans les navigateurs comme google Chrome, WebGL exige que nous ne sommes pas uniquement de la croix de la FFI obstacle à l'accès de ces indigènes OpenGL appels d'API (encore subir la même hauteur), mais nous aussi ont le coût des vérifications de sécurité pour empêcher que le GPU a été détourné pour le calcul.
Si vous êtes à la recherche de quelque chose comme
glDraw*
appels, qui sont appelés par image, cela signifie que nous parlons peut-être (un) commande(s) de grandeur moins d'appels. Une raison de plus d'opter pour quelque chose comme l'instanciation, où le nombre d'appels est considérablement réduite.OriginalL'auteur Engineer