Come stiamo portando Google Earth sul Web

Migliorare l'accesso a Google Earth tra browser con WebAssembly.

Jordon Mears
Jordon Mears

In un mondo ideale, ogni applicazione creata dagli sviluppatori, indipendentemente dalla tecnologia, sarebbe disponibile nel browser. Esistono però degli ostacoli per portare i progetti sul web, a seconda della tecnologia con cui sono stati realizzati e di quanto tale tecnologia sia supportata dai vari fornitori di browser. WebAssembly (Wasm) è una destinazione di compilazione standardizzata da W3C che ci aiuta a risolvere questo problema consentendoci di eseguire codebase da linguaggi diversi da JavaScript sul web.

Lo 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 così semplice come sempre (prova la versione standard di Earth per il web). Puoi sperimentare questa versione beta in Chrome e in altri browser basati su Chromium, tra cui Edge (versione Canary) e Opera, nonché Firefox. Prendi in considerazione questa versione beta se anche tu stai cercando 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 siamo riusciti a portarlo su Android e iOS man mano che gli smartphone prendevano piede, mantenendo la maggior parte del nostro codebase C++ utilizzando NDK e Objective-C++. Nel 2017, quando abbiamo introdotto Earth sul web, abbiamo utilizzato native Client (NaCl) per compilare il codice C++ ed eseguirlo nel browser Chrome.

A quel tempo, NaCl era l'unica tecnologia browser che ci permetteva di trasferire il nostro codice C++ nel browser e di darci le prestazioni di cui Earth aveva bisogno. Sfortunatamente, NaCl era una tecnologia esclusiva di Chrome che non è mai stata adottata nei browser. Ora stiamo iniziando a passare a WebAssembly, che ci consente di prendere lo stesso codice ed eseguirlo nei vari browser. Ciò significa che Earth sarà disponibile per più persone sul web.

Uno screenshot della Terra che mostra la Torre Eiffel

Un thread sull'organizzazione in thread

WebAssembly si sta ancora evolvendo come standard e i browser continuano a essere estesi con ulteriori caratteristiche e funzionalità. Dal punto di vista di Earth, la differenza più significativa nel supporto di WebAssembly tra i browser è il supporto dell'organizzazione in thread. Alcuni browser offrono il supporto del multi-threading, altri no. Pensa alla Terra come a un enorme videogioco in 3D del mondo reale. Pertanto, trasmettiamo costantemente in streaming i dati al browser, li decomprimiamo e li prepariamo per il rendering sullo schermo. La possibilità di svolgere questa operazione su un thread in background ha mostrato un netto miglioramento delle prestazioni di Earth nel browser.

WebAssembly multi-thread si basa su una funzionalità del browser denominata SharedArrayBuffer, che è stata estratta dai browser dopo la rivelazione delle vulnerabilità di sicurezza di Spectre e Meltdown. Per ridurre i potenziali danni causati da attacchi, il team per la sicurezza di Chrome ha introdotto l'isolamento dei siti in Chrome per tutti i sistemi operativi desktop. L'isolamento dei siti limita ogni processo del renderer ai documenti di un singolo sito. Una volta implementata questa funzionalità di sicurezza, Chrome ha riattivato SharedArraybu per desktop, consentendoci di utilizzare WebAssembly multi-thread con Earth per Chrome.

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

Come funziona WebAssembly con diversi browser

Abbiamo imparato molto sullo stato del supporto di WebAssembly nei browser che portano Earth. Se hai intenzione di sviluppare applicazioni utilizzando WebAssembly, è importante comprendere lo stato attuale di come WebAssembly funziona con i diversi browser.

Dispositivi periferici

Edge sta per diventare due esperienze di sviluppo distinte a seconda della scelta di Microsoft di passare dal renderer EdgeHTML a un renderer basato su Chromium. Al momento, la versione beta di Google Earth su WebAssembly non può essere eseguita nell'attuale versione pubblica di Edge perché non è supportato WebGL2. Questo problema verrà risolto nel prossimo futuro non appena verrà lanciata la nuova versione di Edge basata su Chromium. Nel frattempo, puoi scaricare la versione canary di Edge per vedere che Earth funziona abbastanza bene.

Chrome

Chrome supporta molto WebAssembly, incluso il multi-threading sui computer. Di conseguenza, puoi aspettarti un funzionamento più fluido di Earth. Tuttavia, non vediamo l'ora che Chrome aggiunga il supporto per l'allocazione dinamica della memoria con il multi-threading in WebAssembly. Fino ad allora, è possibile che Earth non si avvii sui dispositivi con quantità limitate di memoria (ad esempio le macchine a 32 bit).

Firefox

Firefox offre un buon supporto per WebAssembly, ma ha disattivato il supporto per il multi-threading. Di conseguenza, l'esperienza di Earth sarà più lenta. Ci auguriamo che Mozilla ripristini il supporto per il multi-threading nelle versioni future. Il lato positivo di Firefox è invece l'allocazione dinamica della memoria.

Opera

Opera è basato su Chromium come Chrome, e sulle future versioni di Edge. Tuttavia, la versione corrente di Opera offre solo il supporto a thread unico di WebAssembly. Earth viene eseguito in Opera, ma con un'esperienza leggermente ridotta. Ci auguriamo che le versioni più recenti di Opera offrano supporto per il multi-threading e un supporto più solido per WebAssembly.

Safari

Safari ha una solida implementazione di WebAssembly, ma non supporta completamente WebGL2. Di conseguenza, Earth con WebAssembly non viene eseguito in Safari. Nello specifico, alcuni dei nostri engineer richiedono GLSL 1.2. Ci auguriamo che Earth sarà disponibile anche su Safari, una volta aggiunto il supporto di WebGL2.

In attesa di una maggiore adozione delle funzionalità di WebAssembly

Per rendere disponibile Earth sul web, è stato necessario molto tempo. Circa sei anni fa, abbiamo iniziato con una demo interna iniziale basata su asm.js, che è stata mantenuta e ampliata nel corso degli anni. È stato poi convertito in una build WebAssembly di Earth, quando WebAssembly è diventato lo standard adottato da W3C.

WebAssembly e Earth sono ancora in fase di sviluppo. In particolare, vorremmo passare al backend LLVM utilizzando Emscripten (la toolchain per generare WebAssembly dal codice C++). Questa modifica abiliterà in futuro il supporto SIMD, nonché strumenti di debug più efficaci come le mappe di origine per il codice nella lingua di origine. Altri aspetti che speriamo di vedere sono l'adozione di OffscreenCanvas e il supporto completo per l'allocazione della memoria dinamica in WebAssembly. Ma sappiamo di essere sulla strada giusta: WebAssembly è il futuro a lungo termine per Earth sul web.

Ti invitiamo a provare la nostra versione beta. Facci sapere come funziona per te lasciando un feedback direttamente in Earth.