Come stiamo portando Google Earth sul Web

Miglioramento dell'accesso a Google Earth con WebAssembly su più browser.

Jordon Mears
Jordon Mears

In un mondo ideale, ogni applicazione creata dagli sviluppatori, indipendentemente dalla tecnologia, sarebbe disponibile nel browser. Esistono però delle barriere per portare i progetti sul web, a seconda della tecnologia con cui sono stati creati e del livello di supporto di questa tecnologia da parte dei vari fornitori di browser. WebAssembly (Wasm) è un target di compilazione standardizzato dal W3C che ci aiuta a risolvere questo problema consentendo di eseguire codebase in linguaggi diversi da JavaScript sul web.

È esattamente ciò che abbiamo fatto con Google Earth, disponibile oggi in anteprima beta su WebAssembly. Tieni presente che si tratta ancora di una versione beta di Google Earth e che potrebbe non essere fluida come quella a cui sei abituato (prova la versione normale di Earth per il web). Questa versione beta può essere provata in Chrome e in altri browser basati su Chromium, tra cui Edge (versione Canary), Opera e Firefox. Considera questa versione beta come fonte di ispirazione se anche tu cerchi un supporto migliore tra browser per le tue applicazioni specifiche della piattaforma.

Perché abbiamo scelto WebAssembly per Google Earth

Inizialmente abbiamo scritto la maggior parte di Google Earth in C++ perché era un'applicazione desktop destinata all'installazione. Poi, con l'avvento degli smartphone, siamo riusciti a eseguirne il porting su Android e iOS, mantenendo la maggior parte del codice di base C++ utilizzando NDK e Objective-C++. Nel 2017, quando abbiamo portato Earth sul web, abbiamo utilizzato Native Client (NaCl) per compilare il codice C++ ed eseguirlo nel browser Chrome.

All'epoca, NaCl era l'unica tecnologia di browser che ci consentiva di eseguire il porting del nostro codice C++ nel browser e di ottenere le prestazioni di cui aveva bisogno Earth. Purtroppo, NaCl era una tecnologia solo per Chrome che non è mai stata adottata su tutti i browser. Ora stiamo iniziando a passare a WebAssembly, che ci consente di prendere lo stesso codice ed eseguirlo su più browser. Ciò significa che Earth sarà disponibile per un maggior numero di persone sul web.

Uno screenshot di Earth che mostra la Torre Eiffel

Un thread sull'organizzazione in thread

WebAssembly è ancora in evoluzione come standard e i browser continuano a essere estesi con più funzionalità. Dal punto di vista di Earth, la differenza più significativa nel supporto di WebAssembly tra i browser è il supporto del threading. Alcuni browser offrono il supporto del multithreading, mentre altri no. Pensa alla Terra come a un enorme videogioco 3D del mondo reale. Di conseguenza, trasmettiamo costantemente dati al browser, li decomprimiamo e li rendiamo pronti per il rendering sullo schermo. La possibilità di eseguire questo lavoro in un thread in background ha mostrato un netto miglioramento del rendimento di Earth nel browser.

WebAssembly multi-thread si basa su una funzionalità del browser chiamata SharedArrayBuffer, che è stata rimossa dai browser dopo la rivelazione delle vulnerabilità di sicurezza Spectre e Meltdown. Per ridurre i potenziali danni causati dagli attacchi, il team di sicurezza di Chrome ha introdotto l'isolamento dei siti in Chrome per tutti i sistemi operativi desktop. L'isolamento dei siti limita ogni processo di rendering ai documenti di un singolo sito. Con questa funzionalità di sicurezza, Chrome ha riattivato SharedArrayBuffer per i computer, il che ci ha permesso di utilizzare WebAssembly multithread con Earth per Chrome.

Altri browser stanno lavorando all'isolamento dei siti o ad altre misure di mitigazione per riattivare SharedArrayBuffer. Nel frattempo, Earth viene eseguito in modalità a thread singolo in questi browser.

Come funziona WebAssembly con i diversi browser

Abbiamo imparato molto sullo stato del supporto di WebAssembly nei browser che eseguono il porting di Earth. Se vuoi sviluppare applicazioni utilizzando WebAssembly, è importante comprendere lo stato attuale del funzionamento di WebAssembly con i diversi browser.

Edge

Edge è sul punto di diventare due esperienze di sviluppo distinte in base alla scelta di Microsoft di passare dal motore di rendering EdgeHTML a un motore di rendering basato su Chromium. Al momento, la versione beta di Google Earth su WebAssembly non viene eseguita nell'attuale versione pubblica di Edge a causa della mancanza del supporto di WebGL2. Il problema verrà risolto quando la nuova versione di Edge, basata su Chromium, verrà rilasciata nel prossimo futuro. Nel frattempo, puoi scaricare la versione Canary di Edge e verificare che Earth funzioni abbastanza bene.

Chrome

Chrome supporta ampiamente WebAssembly, incluso il multithreading su computer, quindi puoi aspettarti che Earth funzioni in modo più fluido. Tuttavia, non vediamo l'ora che Chrome aggiunga il supporto per l'allocazione dinamica della memoria con il multithreading in WebAssembly. Fino ad allora, Earth potrebbe non riuscire ad avviarsi su dispositivi con quantità limitate di memoria (ad esempio computer a 32 bit).

Firefox

Firefox offre un buon supporto per WebAssembly, ma ha disattivato il supporto per il multithreading. Di conseguenza, l'esperienza con Earth potrebbe essere più lenta. Ci auguriamo che Mozilla ripristini il supporto del multithreading nelle versioni future. D'altra parte, Firefox supporta l'allocazione dinamica della memoria.

Opera

Opera si basa su Chromium, così come Chrome, insieme alle versioni future di Edge. Tuttavia, la versione corrente di Opera offre il supporto a un solo thread di WebAssembly. Earth funziona in Opera, ma con un'esperienza leggermente degradata. Ci auguriamo che le versioni più recenti di Opera supportino il multithreading e un supporto più solido di WebAssembly.

Safari

Safari ha un'implementazione solida di WebAssembly, ma non supporta completamente WebGL2. Pertanto, Earth con WebAssembly non viene eseguito in Safari. Nello specifico, alcuni dei nostri shader richiedono GLSL 1.2. Ci auguriamo che Earth sia disponibile anche su Safari, una volta aggiunto un supporto migliore per WebGL2.

In attesa di una maggiore adozione delle funzionalità WebAssembly

È stata una lunga strada per rendere disponibile Earth sul web. Circa sei anni fa, abbiamo iniziato con una demo interna basata su asm.js che è stata mantenuta ed espansa nel corso degli anni. È stata poi convertita in una build di Earth in WebAssembly, poiché WebAssembly è diventato lo standard adottato dal W3C.

C'è ancora molto da fare per WebAssembly e Earth. Nello specifico, vorremmo passare al backend LLVM utilizzando Emscripten (la toolchain per generare WebAssembly da codice C++). Questa modifica consentirà il supporto futuro di SIMD, nonché strumenti di debug più efficaci come le mappe di origine per il codice in lingua di origine. Ci auguriamo anche di vedere l'adozione di OffscreenCanvas e il supporto completo dell'allocazione dinamica della memoria in WebAssembly. Sappiamo però di essere sulla strada giusta: WebAssembly è il futuro a lungo termine di Earth sul web.

Prova la nostra versione beta. Facci sapere come funziona lasciando un feedback direttamente in Earth.