Im letzten Monat habe ich mich mit WebGL herumgeschlagen und festgestellt, dass, wenn ich einen großen Vertex-Puffer erstelle und zeichne, er einen niedrigen FPS verursacht. Weiß jemand, ob es gleich ist, wenn ich OpenGL mit C ++ benutze?
Ist das ein Flaschenhals bei der verwendeten Sprache (JavaScript im Falle von WebGL) oder der GPU?
WebGL Beispiele wie dieses zeigen, dass Sie 150.000 Würfel mit einem Puffer mit guter Leistung zeichnen können, aber alles andere als Ich bekomme FPS-Tropfen. Wäre das mit OpenGL dasselbe, oder wäre es in der Lage, einen größeren Puffer zu handhaben?
Im Grunde genommen muss ich eine Entscheidung treffen, WebGL weiter zu verwenden und zu versuchen, durch Code zu optimieren oder - wenn Sie mir sagen, dass OpenGL besser läuft und es ein Sprachgeschwindigkeitsengpass ist, wechseln Sie zu C ++ und verwenden Sie OpenGL.
Wenn Sie nur einen einzigen drawArrays-Aufruf haben, sollte der Unterschied zwischen OpenGL und WebGL für den Aufruf selbst nicht groß sein. Allerdings kann das Einrichten der Daten in Javascript sehr viel langsamer vonstatten gehen, was wirklich von Ihrem Problem abhängt. Wenn der Großteil Ihrer Daten statisch ist (Landschaft, Räume), kann WebGL gut für Sie arbeiten. Andernfalls könnte das Einrichten der Daten in JS für Ihren Zweck zu langsam sein. Es hängt wirklich von deinem Problem ab.
ps. Wenn Sie weitere Details zu Ihren Versuchen angeben, erhalten Sie wahrscheinlich detailliertere / spezifischere Antworten.
Anekdotenweise habe ich Anfang der 2000er Jahre ein Kachel-basiertes Spiel geschrieben, das die alte glVertex()
style API verwendete, die perfekt flüssig lief. Ich habe vor kurzem angefangen, es auf WebGL und glDrawArrays()
zu portieren und jetzt auf meinem modernen PC, der mindestens 10 mal schneller ist, bekommt es eine schreckliche Leistung.
Der Grund scheint zu sein, dass ich einen Anruf gefälscht habe, indem ich glBegin(GL_QUADS); glVertex()*4; glEnd();
verwende. Die Verwendung von glDrawArrays()
zum Zeichnen eines Polygons ist in WebGL viel langsamer als das Gleiche mit glDrawArrays()
in C ++.
Ich weiß nicht, warum das so ist. Vielleicht liegt es daran, dass Javascript langsam ist. Vielleicht liegt es an einigen Kontextwechselproblemen in Javascript. Jedenfalls kann ich nur rund 500 one-polygon glVertex()
Calls machen, während ich immer noch 60 FPS bekomme.
Jeder scheint das zu umgehen, indem er so viel wie möglich auf der GPU macht und so wenig glDrawArray()
Aufrufe pro Frame wie möglich macht. Ob Sie das tun können, hängt davon ab, was Sie zeichnen möchten. In dem Beispiel der von Ihnen verknüpften Cubes können sie alles auf der GPU ausführen, einschließlich des Verschiebens der Cubes, weshalb sie schnell ist. Im Wesentlichen betrogen sie - normalerweise sind WebGL-Anwendungen nicht so.
Google hatte einen Vortrag, in dem sie diese Technik erklärten (sie berechnen auch unrealistisch die Objektbewegung auf der GPU): Ссылка
OpenGL ist flexibler und optimierter wegen der neueren Versionen der verwendeten API. Es ist wahr, wenn Sie sagen, dass OpenGL schneller und leistungsfähiger ist, aber es hängt auch von Ihren Bedürfnissen ab.
Wenn Sie ein Würfelgitter mit Textur benötigen, wäre webGL ausreichend. Wenn Sie jedoch große Projekte mit vielen Vertices, Post-Processing-Effekten und verschiedenen Rendering-Techniken (und Art der Verschiebung, Parallax Mapping, Per-Vertex oder Tessellation) erstellen möchten, dann könnte OpenGL eine bessere und klügere Wahl sein.
Das Optimieren von Puffern für einen einzelnen Aufruf, das Optimieren der Aktualisierung kann durchgeführt werden, aber es hat natürlich seine Grenzen, und ja, OpenGL würde wahrscheinlich sowieso eine bessere Leistung bringen.
Um dies zu beantworten, ist es kein Sprach Engpass, sondern ein api-version-used . WebGL basiert auf OpenGL ES, das einige Profis hat, aber auch etwas langsamer läuft und mehr Abstraktionsebenen für die Code-Verarbeitung hat als reines OpenGL, und das ist der Grund für die Leistungsminderung - mehr Code muss evaluiert werden.
Wenn Ihr Projekt keine webbasierte Lösung benötigt und es nicht wichtig ist, welche Geräte unterstützt werden, wäre OpenGL eine bessere und klügere Wahl.
Hoffe, das hilft.