Amélioration de l'accès multi-navigateur à Google Earth avec WebAssembly
Dans l'idéal, chaque application créée par les développeurs, quelle que soit la technologie, devrait être disponible dans le navigateur. Toutefois, il existe des obstacles à la migration des projets vers le Web, en fonction de la technologie avec laquelle ils ont été créés 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. Elle nous aide à résoudre ce problème en nous permettant d'exécuter des codebases dans d'autres langages que JavaScript sur le Web.
C'est ce que nous avons fait avec Google Earth, disponible aujourd'hui en version bêta preview sur WebAssembly. N'oubliez pas qu'il s'agit toujours d'une version bêta de Google Earth et que l'expérience peut ne pas être aussi fluide que celle que vous connaissez (essayez la version standard de Google Earth pour le Web). Vous pouvez tester cette version bêta dans Chrome et d'autres navigateurs Chromium, y compris Edge (version Canary) et Opera, ainsi que Firefox. La version bêta peut vous inspirer si vous souhaitez également améliorer la compatibilité multinavigateur de vos applications spécifiques à une plate-forme.
Pourquoi nous avons choisi WebAssembly pour Google Earth
Nous avons initialement écrit la majeure partie de Google Earth en C++, car il s'agissait d'une application pour ordinateur destinée à être installée. Nous avons ensuite pu le porter sur Android et iOS à mesure que les smartphones se sont répandus, en conservant la majeure partie de notre base de code C++ à l'aide de NDK et d'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 porter notre code C++ vers le navigateur et de nous fournir le type de performances dont Earth avait besoin. Malheureusement, NaCl était une technologie Chrome uniquement qui n'a jamais été adoptée par les autres navigateurs. Nous commençons maintenant à passer à WebAssembly, qui nous permet de prendre ce même code et de l'exécuter dans tous les navigateurs. Cela signifie que davantage de personnes pourront accéder à Earth sur le Web.
Fil de discussion sur les threads
WebAssembly continue d'évoluer en tant que norme, et les navigateurs continuent d'être étendus avec de nouvelles fonctionnalités. Du point de vue d'Earth, la différence la plus importante entre les navigateurs concernant la prise en charge de WebAssembly est la prise en charge des threads. Certains navigateurs sont compatibles avec le multithreading, d'autres ne le sont pas. Considérez Earth comme un immense jeu vidéo 3D du monde réel. Par conséquent, nous diffusons en continu des données vers le navigateur, les décompressons et les préparons pour l'affichage à l'écran. La possibilité d'effectuer cette tâche sur un thread en arrière-plan a permis d'améliorer de manière significative les performances de la Terre dans le navigateur.
WebAssembly multithread repose sur une fonctionnalité de navigateur appelée SharedArrayBuffer, qui a été supprimée des navigateurs après la révélation des failles de sécurité Spectre et Meltdown. Pour atténuer les dommages potentiels des attaques, l'équipe de sécurité de Chrome a introduit l'isolation de sites dans Chrome pour tous les systèmes d'exploitation pour ordinateur. L'isolation de sites limite chaque processus de rendu aux documents d'un seul site. Avec cette fonctionnalité de sécurité en place, Chrome a réactivé SharedArrayBuffer pour ordinateur, ce qui nous a permis d'utiliser WebAssembly multithread avec Earth pour Chrome.
D'autres navigateurs travaillent sur l'isolation de site ou d'autres mesures d'atténuation afin de réactiver SharedArrayBuffer. En attendant, Earth s'exécute en mode monothread dans ces navigateurs.
Fonctionnement de WebAssembly avec différents navigateurs
Nous avons beaucoup appris sur l'état de la prise en charge de WebAssembly dans les navigateurs qui portent Earth. Si vous allez développer des applications à l'aide de WebAssembly, il est important de comprendre le fonctionnement actuel de WebAssembly avec différents navigateurs.
Edge
Edge est sur le point de devenir deux expériences de développement distinctes, en raison du choix de Microsoft de passer du moteur de rendu EdgeHTML à un moteur de rendu basé sur Chromium. Pour le moment, la version bêta de Google Earth sur WebAssembly ne s'exécute pas sur la version publique actuelle d'Edge, car WebGL2 n'est pas pris en charge. Ce problème sera corrigé lorsque la nouvelle version d'Edge, basée sur Chromium, sera disponible prochainement. En attendant, vous pouvez télécharger la version Canary d'Edge et constater que Google Earth fonctionne très bien.
Chrome
Chrome est très compatible avec WebAssembly, y compris le multithreading sur ordinateur. Vous pouvez donc vous attendre à ce que Google Earth fonctionne plus facilement. Toutefois, nous espérons que Chrome sera compatible avec l'allocation de mémoire dynamique avec le multithreading dans WebAssembly. En attendant, Earth risque de ne pas démarrer sur les appareils disposant de quantités limitées de mémoire (comme les machines 32 bits).
Firefox
Firefox est compatible avec WebAssembly, mais il a désactivé la compatibilité avec le multithreading. Par conséquent, votre expérience avec Earth sera plus lente. Nous espérons que Mozilla rétablira la compatibilité avec le multithreading dans les futures versions. En revanche, Firefox est compatible avec l'allocation de mémoire dynamique.
Opera
Opera est basé sur Chromium, tout comme Chrome et les futures versions d'Edge. Toutefois, la version actuelle d'Opera n'est compatible qu'avec WebAssembly à thread unique. Earth s'exécute dans Opera, mais l'expérience est quelque peu dégradée. Nous espérons que les versions ultérieures d'Opera seront compatibles avec le multithreading et avec WebAssembly de manière plus robuste.
Safari
Safari dispose d'une implémentation solide de WebAssembly, mais n'est pas totalement compatible avec WebGL 2. 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 Earth sera également disponible sur Safari une fois que la compatibilité avec WebGL 2 sera améliorée.
Nous espérons que les fonctionnalités WebAssembly seront davantage adoptées.
La route a été longue pour rendre Earth disponible sur le Web. Il y a environ six ans, nous avons commencé avec une première démonstration interne basée sur asm.js, qui a été entretenue et développée au fil des ans. Il a ensuite été converti en version WebAssembly d'Earth, car WebAssembly est devenu la norme adoptée par le W3C.
WebAssembly et Earth ont encore un long chemin à parcourir. Plus précisément, nous souhaitons passer au backend LLVM à l'aide d'Emscripten (la chaîne d'outils permettant de générer du WebAssembly à partir de code C++). Cette modification permettra une future compatibilité avec SIMD, ainsi que des outils de débogage plus performants, comme les maps sources pour le code en langue source. Nous espérons également que OffscreenCanvas sera adopté et que l'allocation de mémoire dynamique sera entièrement prise en charge dans WebAssembly. Mais nous savons que nous sommes sur la bonne voie: WebAssembly est l'avenir à long terme d'Earth sur le Web.
Veuillez prendre quelques instants pour essayer notre beta. N'hésitez pas à nous donner votre avis sur son efficacité en nous envoyant des commentaires directement dans Earth.