Amélioration de l'accès multinavigateur à Google Earth avec WebAssembly
Dans un monde idéal, toutes les applications créées par les développeurs, quelle que soit la technologie utilisée, seraient disponibles dans le navigateur. Cependant, il existe des obstacles à la mise en ligne de projets sur le Web, en fonction de la technologie avec laquelle ils ont été conçus et de la compatibilité de cette technologie avec les différents fournisseurs de navigateurs. WebAssembly (Wasm) est une cible de compilation standardisée par le W3C qui nous aide à résoudre ce problème en nous permettant d'exécuter du codebase à partir d'autres langages que JavaScript sur le Web.
C'est exactement ce que nous avons fait avec Google Earth, disponible dès aujourd'hui en preview version bêta sur WebAssembly. N'oubliez pas qu'il s'agit encore d'une version bêta de Google Earth et qu'elle ne sera peut-être pas aussi fluide qu'auparavant (essayez la version standard de Google Earth pour le Web). Vous pouvez tester cette version bêta dans Chrome et d'autres navigateurs basés sur Chromium, y compris Edge (version Canary) et Opera, ainsi que Firefox. Cette version bêta peut vous inspirer si vous cherchez également une meilleure compatibilité multinavigateur pour vos applications spécifiques à chaque plate-forme.
Pourquoi nous avons choisi WebAssembly pour Google Earth
À l'origine, nous avons écrit la majeure partie de Google Earth en C++, car il s'agissait d'une application de bureau destinée à être installée. Nous avons ensuite pu le transférer sur Android et iOS grâce à l'intégration des smartphones, et avons conservé la majeure partie de notre codebase C++ à l'aide du NDK et de Objective-C++. En 2017, lorsque nous avons lancé Earth sur le Web, nous avons utilisé Native Client (NaCl) pour compiler le code C++ et l'exécuter dans le navigateur Chrome.
À l'époque, NaCl était la seule technologie de navigateur qui nous permettait de transférer notre code C++ vers le navigateur et de bénéficier des performances requises par Earth. Malheureusement, NaCl était une technologie reposant exclusivement sur Chrome, qui n'a jamais été adoptée par tous les navigateurs. Nous commençons maintenant à passer à WebAssembly, qui nous permet d'utiliser le même code et de l'exécuter sur plusieurs navigateurs. Google Earth sera donc disponible pour davantage d'internautes sur le Web.
Un thread sur des threads
WebAssembly évolue encore et les navigateurs continuent d'être étendues avec de nouvelles fonctionnalités. Du point de vue de Google Earth, la principale différence de compatibilité de WebAssembly entre les navigateurs est la compatibilité avec les threads. Certains navigateurs sont compatibles avec le multithreading, d'autres non. Considérez la Terre comme un immense jeu vidéo en 3D du monde réel. Nous diffusons donc des données en continu dans le navigateur, nous les décompressons et les préparons pour le rendu à l'écran. La possibilité d'effectuer ce travail sur un fil de discussion en arrière-plan a montré une nette amélioration des performances d'Earth dans le navigateur.
WebAssembly multithread s'appuie sur une fonctionnalité de navigateur appelée SharedArrayBuffer, qui a été extraite des navigateurs après la découverte des failles de sécurité Spectre et Meltdown. Afin de limiter les dommages potentiels causés par les attaques, l'équipe Chrome chargée de la sécurité a lancé l'isolation de sites dans Chrome pour tous les systèmes d'exploitation d'ordinateur de bureau. L'isolation de sites limite chaque processus de moteur de rendu aux documents d'un seul site. Une fois cette fonctionnalité de sécurité en place, Chrome a réactivé SharedArrayBuffer pour ordinateur. Cela nous a permis d'utiliser WebAssembly multithread avec Earth pour Chrome.
D'autres navigateurs travaillent à l'isolation de sites ou à d'autres mesures d'atténuation pour réactiver SharedArrayBuffer. En attendant, Earth fonctionne avec un seul thread dans ces navigateurs.
Fonctionnement de WebAssembly avec différents navigateurs
Nous avons beaucoup appris sur la prise en charge de WebAssembly dans les navigateurs compatibles avec Earth. Si vous envisagez de développer des applications à l'aide de WebAssembly, il est important de comprendre l'état actuel du fonctionnement de WebAssembly avec différents navigateurs.
Périphérie
Edge est sur le point de devenir deux expériences de développement distinctes dans la mesure où Microsoft a décidé de remplacer le moteur de rendu EdgeHTML par un moteur de rendu basé sur Chromium. Pour le moment, la version bêta de Google Earth sur WebAssembly ne fonctionne pas sur la version publique actuelle d'Edge en raison de l'incompatibilité avec WebGL2. Ce problème sera résolu une fois que la nouvelle version d'Edge, basée sur Chromium, sera bientôt disponible. En attendant, vous pouvez télécharger la version Canary d'Edge. Vous verrez que Google Earth fonctionne très bien.
Chrome
Chrome est parfaitement compatible avec WebAssembly, y compris le traitement multithread sur ordinateur. Vous pouvez donc vous attendre à ce que Earth fonctionne de manière plus fluide. Toutefois, nous sommes impatients de permettre à Chrome d'accepter l'allocation dynamique de mémoire avec le multithreading dans WebAssembly. En attendant, Google Earth risque de ne pas démarrer sur les appareils disposant d'une quantité de mémoire limitée (tels que les ordinateurs 32 bits).
Firefox
Firefox offre une bonne compatibilité avec WebAssembly, mais le multithreading est désactivé. Par conséquent, vous pouvez vous attendre à un ralentissement de l'expérience utilisateur dans Earth. Nous sommes impatients de demander à Mozilla de reprendre la prise en charge du multithread dans les prochaines versions. L'avantage, c'est que Firefox prend en charge l'allocation de mémoire dynamique.
Opéra
Opera est basé sur Chromium tout comme Chrome, ainsi que sur les prochaines versions d'Edge. Cependant, la version actuelle d'Opera n'offre qu'une compatibilité monothread avec WebAssembly. Earth s'exécute dans Opera, mais avec une expérience quelque peu dégradée. Nous espérons que les nouvelles versions d'Opera prendront en charge le multithreading et une compatibilité plus robuste avec WebAssembly.
Safari
Safari dispose d'une implémentation forte de WebAssembly, mais n'est pas totalement compatible avec WebGL2. Par conséquent, Earth avec WebAssembly ne s'exécute pas dans Safari. Plus précisément, certains de nos nuanceurs nécessitent GLSL 1.2. Nous espérons que Google Earth sera également disponible sur Safari, une fois qu'il sera plus compatible avec WebGL2.
Nous sommes impatients d'adopter davantage les fonctionnalités WebAssembly.
La mise à disposition d'Earth sur le Web a pris du temps. Il y a environ six ans, nous avons commencé avec une première démonstration interne basée sur asm.js, qui a été maintenue et étendue au fil des ans. Il a ensuite été converti en version WebAssembly d'Earth, devenant ainsi la norme adoptée par le W3C.
Il nous reste encore du chemin à parcourir pour WebAssembly et Earth. Plus précisément, nous aimerions passer au backend LLVM à l'aide d'Emmscripten (la chaîne d'outils permettant de générer WebAssembly à partir du code C++). Ce changement permettra la compatibilité avec SIMD à l'avenir, ainsi que des outils de débogage plus efficaces, tels que les mappages sources pour le code en langage source. Nous espérons également voir l'adoption de OffscreenCanvas, une compatibilité totale de l'allocation de mémoire dynamique dans WebAssembly. Mais nous savons que nous sommes sur la bonne voie: WebAssembly est l'avenir à long terme pour Earth sur le Web.
Veuillez prendre quelques instants pour essayer notre version bêta. Donnez-nous votre avis en laissant vos commentaires directement dans Earth.