Optimierungen in der Wonderland Engine

Um komplexere Anwendungen und Szenen in Deiner WebXR-App zu ermöglichen, implementiert die Wonderland Engine verschiedene Optimierungen. Finde eine unvollständige Liste unten:

Rendering-Performance 

Optimierungen, die auf schnelleres Frame-Rendering abzielen.

Dual Quaternion Szenengraph 

Während konventionelle Szenengraphen mit Matrizen implementiert sind, verwendet der Szenengraph der Wonderland Engine Dualquaternionen.

Dualquaternionen benötigen nur die Hälfte des Speichers einer 4x4 Matrix und weniger Operationen zum Verketten.

Da Dualquaternionen nur Rotation und Translation repräsentieren, ergänzen wir sie mit einem separaten Skalierungsvektor.

Dualquaternionen sind besonders vorteilhaft für das Skinning, da sie Volumen besser erhalten als andere Methoden. Mit dem Szenengraphen integriert sich dies hervorragend.

Runtime Batching 

Wonderland Engine verbindet Meshes zur Laufzeit, um es zu ermöglichen, mehrere Meshes mit einem einzigen Draw-Call zu zeichnen. Da jedes Mesh normalerweise unterschiedliche Materialien verwendet, haben wir spezielle Shader, die in der Lage sind, eine Liste von Materialien zu verwenden, um Teile des Batches auf unterschiedliche Weise zu zeichnen.

Texturen werden automatisch zu “Texture Atlases” kombiniert.

Diese Optimierung reduziert Draw-Calls erheblich, indem Tausende von Draw-Calls in einen einzigen zusammengefasst werden, solange sie denselben Shader teilen.

Komprimierte Texturen und Texture Streaming 

Durch die Verwendung komprimierter Texturformate auf der GPU nutzt die Wonderland Engine den GPU-Speicher effizienter. Die gleiche Menge an GPU-Speicher kann mehr Texturen halten und die Texturauflösung in der Szene kann höher sein.

Darüber hinaus tauscht unsere Texture Streaming-Funktion Texturen basierend darauf ein und aus dem Speicher, was für die Kamera sichtbar ist. Dies ermöglicht die Verwendung hochauflösender Texturen auch in speicherbeschränkten Umgebungen.

WebAssembly (C++) 

Die Wonderland Engine ist in C++ geschrieben und wird in WebAssembly kompiliert.

WebAssembly gibt der Wonderland Engine mehr Kontrolle über die Speichernutzung und eine höhere Leistung im Vergleich zu JavaScript. Rechenintensive Features, z. B. das Berechnen von Szenengraph-Transformationen oder speicherintensive Features wie Batching, können viel effizienter implementiert werden.

WebAssembly SIMD 

SIMD-Instruktionen in WebAssembly ermöglichen die Verarbeitung mehrerer Datenstücke in einem einzigen Befehl. Dies beschleunigt die Vektormathematik erheblich.

WebAssembly SIMD wird seit März 2023 von allen großen Browsern unterstützt.

Datenorientiertes Design 

Der Szenengraph und das Komponentensystem der Wonderland Engine sowie andere Teile der Codebasis folgen Datenorientiertes Design (DOD). DOD ist eine Methode, um Code so zu schreiben, dass Daten effizienter von der CPU verarbeitet werden, indem die Cache-Nutzung verbessert und vorhersagbare Codeausführung unterstützt wird.

Ladezeiten 

Optimierungen, die auf schnellere Ladezeiten abzielen.

Binäres Szenenformat 

Da das Parsen von Text (z. B. aus gltf oder obj Dateien) in Binärdateien für WebGL bereits im Editor erfolgt, werden die Daten direkt im Binärformat an die Runtime übergeben.

Diese Binärdaten sind so angeordnet, dass minimaler Aufwand von der Runtime erforderlich ist, um sie für das Rendering zu nutzen.

Es ermöglicht uns auch, Quantisierung auf z. B. die Mesh-Daten durchzuführen: Einige Mesh-Eigenschaften können mit weniger Bits pro Vertex gespeichert werden, wenn ihr Wertebereich bekannt ist.

Basis Universal Bildkompression 

Unterstützung für komprimierte Textur-Formate ist gerätespezifisch. Mit Basis Universal können wir Bilder in ein einzelnes Format komprimieren, das dann in gerätespezifische komprimierte GPU-Texturformate “transkodiert” werden kann.

Animationskompression 

Wir verwenden Quantisierung und entfernen redundante Keyframes, um die Größe der Animationen zu reduzieren.

Runtime-Größe 

Wir legen besonderen Wert darauf, die Größe unserer WebAssembly-Binärdatei klein zu halten und den Footprint der Abhängigkeiten niedrig zu halten, da die Runtime eines der ersten Dinge ist, die heruntergeladen werden.

Unsere WebAssembly-Runtime ist derzeit ~580 kB gzipped und wird kontinuierlich weiter reduziert.

Spezielle Optimierungen 

Optimierungen, die für bestimmte Plattformen durchgeführt werden.

Safari auf iOS und Apple Vision 

Im Jahr 2022 haben wir einen großen Teil unseres Renderers umgeschrieben, um eine ausgezeichnete Leistung auf iOS Safari sicherzustellen.

Heute ist die Leistung von Wonderland Engine auf iOS vergleichbar mit der Leistung auf Android. Da Safari auf Apple Vision PRO die gleichen Leistungseigenschaften erbt, bieten wir dort ebenfalls eine hervorragende Performance.