Frage

Ich versuche, für das Rendering große Innenszenen eine Vorstellung von der Praktikabilität von WebGL zu bekommen, bestehend aus 100K ist die Dreiecke. Diese Dreiecke sind über viele Objekte verteilt, und es gibt viele Materialien, die in der Szene. Auf der anderen Seite gibt es keine beweglichen Teile. Und die Materialien sind in der Regel recht einfach sein, vor allem auf Basis von Textur-Maps. Es gibt eine Menge von Textur-Map-Sharing .. zum Beispiel alle Stühle in Szene eine gemeinsame Karte teilen. Es gibt auch einige Multitexturing -. Bis zu drei Texturen in einem Material überlagert

Ich habe ein wenig Experimentieren getan und das Lesen und sammeln, die häufig Materialien während eines Rendering-Pass Schalt werden die Dinge verlangsamen. Zum Beispiel wird eine Szene mit 200K Dreiecken signifikanten Leistungsunterschiede, je nachdem, ob es 10 oder 1000 Objekte, unter der Annahme, dass jedes Mal, wenn ein Objekt ein neues Material angezeigt wird, wird eingestellt.

So scheint es, dass, wenn die Leistung wichtig ist die Szene von Materialien so wie sortiert werden soll Materialien Schalen minimieren. Was ich suche sind Richtlinien, wie der Overhead von verschiedenen Zustandsänderungen zu denken, und wo finde ich den größten Knall für den Dollar bekommen. Zum Beispiel:

  • Was sind die relativen Performance Kosten von, sagen wir, gl.useProgram(), gl.uniformMatrix4fv(), gl.drawElements()
  • sollte ich versuchen, ubershaders zu schreiben Shader-Umschaltung zu minimieren?
  • sollte ich zu aggregieren Geometrie versuchen, die Anzahl von gl.drawElements() Anrufe zu minimieren

Ich weiß, dass Meilenzahl auf Browser variieren kann, Betriebssystem und Grafikhardware. Und ich suche auch nicht für heroische Maßnahmen. Nur einige Richtlinien von Menschen, die bereits einige Erfahrung Szenen bei der Herstellung schnell gehabt haben. Ich will hinzufügen, dass, während ich einige Erfahrung mit fester Pipeline OpenGL-Programmierung in der Vergangenheit gehabt habe, ich bin ziemlich neu in die WebGL / OpenGL ES 2.0 Art und Weise, Dinge zu tun.

War es hilfreich?

Lösung

Haben Sie Batch, Batch, Batch lesen? Zwar liegt der Schwerpunkt auf directX, aber die Argumentation gilt in geringerem Maße zu öffnen / WebGL auch: Jeder API-Aufruf auf der CPU erheblichen Aufwand hat. Die Beratung ist es, alle Optionen des API verwenden, um Aktien Texturen, Verwendung Instancing (falls vorhanden), schreibt komplexe Shadern viele Zeichenaufrufe zu vermeiden. Wenn Sie also das ganze Haus als eine einzige Masche in einem einzigen Aufruf ziehen können, das wäre besser als 1000 Anrufe für jedes Zimmer. Schreiben ubershaders ist reccomended aber vor allem, weil es kann Ihnen erlauben, ziehen Anrufe zu entfernen, nicht weil GPU Zustand Schalt teuer ist.

Dies setzt voraus, kürzlich Hardware. Für Low-End-Plattformen (iPad?) Oder Intel GMA-Chips werden die Engpässe an anderer Stelle sein (wie in der Software-Vertex-Verarbeitung).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top