Ottimizzazioni di Wonderland Engine
Per consentire applicazioni e scene più complesse nella tua app WebXR, Wonderland Engine implementa varie ottimizzazioni. Trova un elenco non esaustivo qui di seguito:
Prestazioni di rendering
Ottimizzazioni che mirano a rendere più veloce il rendering dei fotogrammi.
Grafico della scena con quaternioni duali
Mentre i grafici delle scene convenzionali sono implementati usando matrici, il grafico delle scene di Wonderland Engine utilizza quaternioni duali.
I quaternioni duali richiedono solo metà della memoria di una matrice 4x4 e necessitano di meno operazioni per concatenarsi.
Poiché i quaternioni duali rappresentano solo rotazione e traslazione, li arricchiamo con un vettore di scala separato.
I quaternioni duali sono particolarmente vantaggiosi per lo skinning, poiché preservano meglio il volume rispetto ad altri metodi. Con il grafico delle scene, ciò si integra perfettamente.
Batching a runtime
Wonderland Engine unisce le mesh a runtime per consentire che più mesh vengano disegnate con una singola draw call. Poiché ogni mesh di solito utilizza materiali diversi, abbiamo shader speciali che sono in grado di utilizzare un elenco di materiali per disegnare parti del batch in modi diversi.
Le texture vengono combinate automaticamente in “atlanti di texture”.
Questa ottimizzazione riduce notevolmente le draw call unendo migliaia di draw call in una sola, purché condividano lo stesso shader.
Texture compresse e streaming di texture
Utilizzando formati di texture compressi sulla GPU, Wonderland Engine utilizza la memoria della GPU in modo più efficiente. La stessa quantità di memoria GPU può contenere più texture e la risoluzione delle texture nella scena può essere maggiore.
Inoltre, la nostra funzione di Streaming di Texture scambia pezzi di texture dentro e fuori dalla memoria in base a ciò che è visibile alla fotocamera. Questo consente l’uso di texture ad alta risoluzione anche in ambienti con memoria limitata.
WebAssembly (C++)
Wonderland Engine è scritto in C++ e compilato in WebAssembly.
WebAssembly offre a Wonderland Engine più controllo sull’uso della memoria e prestazioni maggiori rispetto a JavaScript. Funzionalità che richiedono molta elaborazione, come il calcolo delle trasformazioni del grafico delle scene o funzionalità che richiedono molta memoria come il batching, possono essere implementate in modo molto più efficiente.
WebAssembly SIMD
Le istruzioni SIMD in WebAssembly consentono di elaborare più dati con un singolo comando. Questo accelera notevolmente il calcolo dei vettori.
WebAssembly SIMD è supportato su tutti i principali browser da marzo 2023.
Progettazione orientata ai dati
Il grafico delle scene e il sistema di componenti di Wonderland Engine, così come altre parti della base di codice, seguono il Design Orientato ai Dati (DOD). Il DOD è un modo di scrivere codice tale che i dati vengono processati più efficientemente dalla CPU migliorando l’uso della cache e agevolando l’esecuzione predittiva del codice.
Tempo di caricamento
Ottimizzazioni mirate a un caricamento più veloce.
Formato di scena binario
Poiché l’analisi del testo (ad esempio da file gltf
o obj
) in binario per WebGL viene già fatta nell’editor, i dati vengono passati al runtime direttamente in un formato binario.
Questi dati binari sono organizzati in modo tale che il runtime abbia bisogno di uno sforzo minimo per utilizzarli nel rendering.
Ciò ci consente anche di fare Quantizzazione ad esempio sui dati delle mesh: alcune proprietà delle mesh possono essere memorizzate con meno bit per vertice, se il loro intervallo di valori è noto.
Compressione delle immagini Basis Universal
Il supporto ai formati di Texture Comprese varia a seconda del dispositivo. Con Basis Universal, possiamo comprimere le immagini in un formato unico che può poi essere convertito (“transcodificato”) nei formati di texture compressi specifici per il dispositivo.
Compressione delle animazioni
Utilizziamo la Quantizzazione e rimuoviamo fotogrammi chiave ridondanti per ridurre la dimensione delle animazioni.
Dimensione del runtime
Facciamo particolare attenzione a mantenere la dimensione del nostro binario WebAssembly piccola e ridurre al minimo l’impronta delle dipendenze, poiché il runtime è una delle prime cose da scaricare.
Attualmente, il nostro runtime WebAssembly è di circa 580 kB gzip e viene continuamente ridotto ulteriormente.
Ottimizzazioni speciali
Ottimizzazioni effettuate per piattaforme specifiche.
Safari su iOS e Apple Vision
Nel 2022 abbiamo riscritto una grande parte del nostro renderer per garantire ottime prestazioni su Safari per iOS.
Oggi, le prestazioni di Wonderland Engine su iOS sono paragonabili alle prestazioni su Android. Poiché Safari su Apple Vision PRO eredita le stesse caratteristiche prestazionali, forniamo anche lì eccellenti prestazioni.