Der effizienteste Weg, mehrere identische Objekte zu zeichnen?

9

Ich möchte aus vielen Cubes ein Spiel machen und plane es auf mobilen Plattformen und auch im Web mit webgl. Mein Problem ist, wenn ich einen Drawellements-Aufruf pro Cube mache, nehme ich einen Schlag auf die Bildrate. Gibt es eine Möglichkeit, einen einzigen Draw-Call zu OpenGLs zu machen, um sie zu zeichnen? Der einzige Unterschied zwischen den Würfeln wäre Position und Farbe.

    
Xavier 26.09.2010, 17:01
quelle

3 Antworten

4

Ich bin selbst auf dasselbe Problem gestoßen. Ich habe ähnliche Frage gestellt und habe es gestern selbst geantwortet. Schau dir an:

Effiziente Art des Zeichnens in OpenGL ES

Sie möchten Ihre Vertex-Puffer erstellen und diese nur einmal mit gl.bufferData in den Grafikkartenspeicher hochladen. Verwenden Sie dann jedes Mal Referenz auf diesen Puffer, wenn Sie gl.drawElements oder gl.drawArrays ausführen. Bis zum nächsten Mal, wenn sich der Inhalt Ihrer 3D-Szene ändert, können Sie diesen Puffer verwenden, der in den Grafikkartenspeicher geladen wird.

    
Jayesh 14.10.2010, 02:01
quelle
0

Folgen Sie dem Modell von UITableView, wie Zellen aus der Warteschlange genommen werden. Ich würde ein Objekt erstellen, das Objekte, die Sie gezeichnet haben, verfolgt und sie mit einem Bezeichner verknüpft. Dann können Sie sie einfach mit dem Identifizierer aus der Warteschlange entfernen. Wenn Sie wissen, dass Sie viele Versionen desselben Objekts zeichnen werden, verwenden Sie dieses Objekt, um Rendering / Zuordnungen zu minimieren.

    
DexterW 27.09.2010 15:25
quelle
0

Wenn Sie Vertex Arrays für Ihre glDrawElements () verwenden, würde ich stattdessen Vertex Buffer Objects verwenden. Dies speichert die Datenserverseite (in GRAM) anstelle der Clientseite (im System-RAM). Auf diese Weise können Sie glDrawElements () -Aufrufe mit viel weniger CPU- & gt; GPU-Datenübertragungsaufwand machen.

Alternativ können Sie Ihre Würfel in Anzeigelisten speichern. Auf diese Weise können Sie mit glTranlate () einen Würfel verschieben und dann einfach die Anzeigeliste aufrufen, um sie zu rendern. Der einzige Nachteil bei der Verwendung von Anzeigelisten ist, dass alles, was Sie in der Anzeigeliste tun, unveränderlich ist; Sie können die Aufrufe in der Anzeigeliste nicht ändern, ohne sie vollständig neu zu kompilieren.

    
jay.lee 27.09.2010 20:58
quelle