2013-07-07 23 views
8

Für den letzten Monat habe ich mit WebGL verwirrt, und festgestellt, dass, wenn ich einen großen Vertex-Puffer erstellen und zeichnen es niedrige FPS verursacht. Weiß jemand, ob es gleich ist, wenn ich OpenGL mit C++ benutze?Leistung von WebGL und OpenGL

Ist das ein Engpass mit der Sprache (JavaScript im Falle von WebGL) oder der GPU?

WebGL examples like this zeigen, dass Sie 150.000 Würfel mit einem Puffer mit guter Leistung zeichnen können, aber alles andere als das, bekomme ich FPS-Tropfen. Wäre das mit OpenGL gleich, oder wäre es in der Lage, einen größeren Puffer zu handhaben?

Grundsätzlich muss ich eine Entscheidung treffen, WebGL weiter zu verwenden und zu versuchen, durch Code zu optimieren oder - wenn Sie mir sagen, OpenGL würde besser und es ist eine Sprachgeschwindigkeit Flaschenhals, wechseln Sie zu C++ und OpenGL verwenden.

+0

hier Fakten entwickelt haben. Nur, um Farbe auf die Hauptantwort hinzuzufügen, sind Fließkommaoperationen in Javascript 4-10x langsamer als C++. Nachdem Sie jedoch Daten auf die Grafikkarte geladen haben, sollten WebGL und OpenGL ähnlich funktionieren. Chrome scheint das zu verkraften, andere Browser sind langsamer. – Atifm

Antwort

8

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.

p.s. Wenn Sie nähere Angaben zu dem machen, was Sie vorhaben, erhalten Sie wahrscheinlich detailliertere/spezifischere Antworten.

0

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.

Optimieren von Puffern zu einem einzigen Aufruf, Optimierung der Aktualisierung von diesen kann getan werden, aber es hat natürlich seine Grenzen, und ja, würde OpenGL wahrscheinlich sowieso eine bessere Leistung.

zu beantworten, es nicht zu einem Engpass Sprache ist, sondern ein api-Version verwendet ein. 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 sich nicht dafür interessiert, welche Geräte unterstützt werden, wäre OpenGL eine bessere und klügere Wahl.

Hoffe, das hilft.

+5

Da * WebGL * auf * OpenGL ES 2.0 * basiert und somit bereits die moderne (und angeblich effizientere) API verwendet, die auch die modernen Desktop * OpenGL * - Versionen verwenden, würde ich eher sagen, dass es das komplette Gegenteil der APIs mit unterschiedlicher Leistung Es ist viel wahrscheinlicher, dass * Javascript * nicht die beste Option für Echtzeit-Berechnungen ist. –

+0

Eigentlich ist _javascript_ relativ schnell mit Mathe und nahe an einem kompilierten C-Code. Ich habe eine 3D-Engine sowohl in WebGL/OpenGL gebaut und ich habe noch einen bemerkbaren Unterschied zu finden. Ich habe ein kolossales Terrain-Raster von etwa 256x256 (hfz-Gelände) sowohl in der Lade-/Rendering-Performance als auch zwischen Desktop-OpenGL/ES getestet und es gab keinen wirklichen Unterschied. –

+0

Das Problem mit Javascript ist der Function Call Overhead und das Verschieben der Daten in die Puffer (schneller mit typisierten/nativen Arrays, die aber in js nicht oft genug benutzt werden) ist VIEL höher in C, so dass die Anzahl der Zeichenaufrufe minimiert werden muss. Ein einzelnes Netz ist großartig, 1000 Objekte sind in C gut, aber nicht so js. – user1496062

1

Anekdotisch schrieb ich in den frühen 2000er Jahren ein Kachel-basiertes Spiel mit der alten glVertex() API, die perfekt flüssig lief. Ich habe vor kurzem begonnen, es auf WebGL und glDrawArrays() portieren und jetzt auf meinem modernen PC, der mindestens 10 mal schneller ist, bekommt es schreckliche Leistung.

Der Grund scheint zu sein, dass ich einen Anruf vortäuschen wollte glBegin(GL_QUADS); glVertex()*4; glEnd(); mit glDrawArrays(). Verwenden glDrawArrays() zum Zeichnen eines Polygons ist viel viel langsamer in WebGL als das gleiche mit glVertex() war in C++.

Ich weiß nicht, warum das ist. Vielleicht liegt es daran, dass Javascript langsam ist. Vielleicht liegt es an einigen Kontextwechselproblemen in Javascript. Anyway kann ich nur um 500 Ein-Polygon-Anrufe glDrawArray() tun, während immer noch 60 FPS erhalten.

Jeder scheint um dies zu arbeiten, indem so viel auf der GPU wie möglich, und so wenig wie möglich tun glDrawArray() Aufrufe pro Frame. Ob Sie das tun können, hängt davon ab, was Sie zeichnen möchten. In dem Beispiel von Würfeln, die Sie verlinkt haben, können sie alles auf der GPU tun, einschließlich des Verschiebens der Würfel, weshalb es schnell ist. Im Wesentlichen haben sie betrogen - normalerweise werden WebGL-Apps nicht so sein.

Google hatte ein Gespräch, wo sie diese Technik erklärt (sie unrealistische auch die Objektbewegung auf der GPU berechnen): https://www.youtube.com/watch?v=rfQ8rKGTVlg

+0

Hallo, der Grund für das, was Sie sehen, ist, weil glDrawArray viel komplizierter als glBegin ist. Sie müssen jedes Mal einen statischen Betrag bezahlen, der ziemlich hoch ist. Was Sie tun sollten, ist alle Polygone in einem VAO zu puffern, so dass Sie nur ein glDrawArray verwenden können. Je mehr Polygone Sie haben, desto größer wird der Geschwindigkeitsabstand zwischen glDraArray und dem alten gl, und in einer typischen Szene aus Millionen von Polygonen werden Sie exponentielle Geschwindigkeitsgewinne sehen. – user3427457

+0

Ja, das habe ich gemacht. Leider ist das Streamen zu einem VBO auch ziemlich langsam - zumindest erscheint es langsamer, als ich mich 'glBegin()' daran erinnere. Wenn Sie Streaming vermeiden können, ist es sehr schnell, aber das hängt von der Anwendung ab. – Timmmm

Verwandte Themen