Browserübergreifender Zugriff auf Google Earth mit WebAssembly
Im Idealfall wäre jede Anwendung, die Entwickler entwickeln, im Browser verfügbar, unabhängig von der verwendeten Technologie. Doch es gibt Hürden, wenn es darum geht, Projekte ins Web zu bringen, je nachdem, mit welcher Technologie sie erstellt wurden und wie gut diese Technologie von den verschiedenen Browser-Anbietern unterstützt wird. WebAssembly (Wasm) ist ein vom W3C standardisiertes Compile-Ziel, das uns bei der Lösung dieses Problems hilft, indem es uns ermöglicht, Codebasis aus anderen Sprachen als JavaScript im Web auszuführen.
Genau das haben wir mit Google Earth geschafft, das ab heute als Vorab-Betaversion von WebAssembly verfügbar ist. Es handelt sich hierbei jedoch noch um eine Betaversion von Google Earth, die möglicherweise nicht so reibungslos funktioniert, wie Sie es gewohnt sind. Probieren Sie doch einmal die reguläre Version von Google Earth Web aus. Du kannst die Betaversion in Chrome und anderen Chromium-basierten Browsern wie Edge (Canary-Version), Opera und Firefox testen. Auch Sie können sich von dieser Betaversion inspirieren lassen, wenn Sie nach einer besseren browserübergreifenden Unterstützung für Ihre plattformspezifischen Anwendungen suchen.
Warum wir uns bei Google Earth für WebAssembly entschieden haben
Wir haben Google Earth ursprünglich in C++ geschrieben, da es sich um eine Desktop-Anwendung für die Installation handelte. Dann konnten wir es auf Android und iOS übertragen, wenn Smartphones sich einiges verändert haben. Dabei haben wir den größten Teil unserer C++-Codebasis mithilfe von NDK und Objective-C++ beibehalten. Als wir 2017 Earth im Web eingeführt haben, nutzten wir Native Client (NaCl), um den C++-Code zu kompilieren und ihn im Chrome-Browser auszuführen.
Damals war NaCl die einzige Browsertechnologie, die es uns ermöglichte, unseren C++-Code in den Browser zu übertragen und uns die Leistung zu liefern, die Earth brauchte. Leider war NaCl eine reine Chrome-Technologie, die in keinem Browser eingesetzt wurde. Jetzt beginnen wir mit der Umstellung auf WebAssembly, mit der wir denselben Code in verschiedenen Browsern ausführen können. Das bedeutet, dass Google Earth für mehr Nutzer im Web verfügbar sein wird.
Ein Thread über Threading
WebAssembly wird immer noch zum Standard und Browser werden mit immer mehr Funktionen erweitert. Aus Sicht der Erde ist der wichtigste Unterschied bei der Unterstützung von WebAssembly zwischen Browsern die Unterstützung von Threading. Einige Browser unterstützen Multithreading, andere nicht. Die Erde ist wie ein riesiges 3D-Videospiel mit der realen Welt. Daher streamen wir ständig Daten zum Browser, dekomprimieren sie und bereiten sie für das Rendering auf dem Bildschirm vor. Diese Arbeit in einem Hintergrundthread hat zu einer deutlichen Verbesserung der Leistung von Google Earth im Browser geführt.
Die Multithread-WebAssembly stützt sich auf eine Browserfunktion namens SharedArrayBuffer, die aus Browsern abgerufen wurde, nachdem die Sicherheitslücken Spectre und Meltdown aufgedeckt wurden. Das Sicherheitsteam von Chrome hat die Website-Isolierung für alle Desktop-Betriebssysteme in Chrome eingeführt, um potenzielle Schäden durch Angriffe abzuschwächen. Bei der Website-Isolierung werden die einzelnen Renderer-Prozesse auf Dokumente von einer einzigen Website beschränkt. Mit dieser Sicherheitsfunktion wurde SharedArrayBuffer für den Desktop wieder aktiviert. So konnten wir Multithread-WebAssembly mit Earth für Chrome verwenden.
Andere Browser arbeiten an der Website-Isolierung oder anderen Abhilfemaßnahmen, um „SharedArrayBuffer“ wieder zu aktivieren. In der Zwischenzeit führt Earth in diesen Browsern Single-Threaded aus.
Funktionsweise von WebAssembly mit verschiedenen Browsern
Wir haben eine Menge über den Stand der WebAssembly-Unterstützung in Browsern gelernt, die Google Earth portieren. Wenn Sie Anwendungen mit WebAssembly entwickeln möchten, ist es wichtig, den aktuellen Stand der Funktionsweise von WebAssembly mit verschiedenen Browsern zu verstehen.
Edge
Edge steht kurz davor, zwei verschiedene Entwicklungsumgebungen zu entwickeln, die auf der Entscheidung von Microsoft basieren, vom EdgeHTML-Renderer zu einem Chromium-basierten Renderer zu wechseln. Derzeit wird die Betaversion von Google Earth auf WebAssembly nicht in der aktuellen öffentlichen Version von Edge ausgeführt, da WebGL2 nicht unterstützt wird. Dieses Problem wird behoben, sobald die neue, auf Chromium basierende Version von Edge veröffentlicht wird. In der Zwischenzeit können Sie die Canary-Version von Edge herunterladen und sehen, dass Google Earth ziemlich gut funktioniert.
Chrome
Chrome bietet umfassende Unterstützung für WebAssembly, einschließlich Multithreading auf Desktop-Computern, sodass Google Earth flüssiger läuft. Wir freuen uns aber darauf, in WebAssembly die dynamische Speicherzuweisung mit Multithreading in Chrome zu unterstützen. Auf Geräten mit begrenztem Arbeitsspeicher (z. B. 32-Bit-Computern) startet Google Earth möglicherweise nicht.
Firefox
Firefox bietet gute Unterstützung für WebAssembly, hat jedoch die Unterstützung für Multithreading deaktiviert. Daher ist die Nutzung von Google Earth voraussichtlich langsamer. Wir freuen uns darauf, dass Mozilla die Unterstützung für Multithreading in zukünftigen Versionen wieder anbieten wird. Auf der anderen Seite unterstützt Firefox die dynamische Arbeitsspeicherzuweisung.
Oper
Opera basiert auf Chromium genau wie Chrome sowie auf künftigen Versionen von Edge. Die aktuelle Version von Opera unterstützt jedoch nur Einzelthreads von WebAssembly. Google Earth läuft zwar in Opera, die Leistung ist jedoch etwas eingeschränkt. Hoffentlich bieten neuere Versionen von Opera Unterstützung für Multithreading und robustere WebAssembly-Unterstützung.
Safari
Safari hat eine starke Implementierung von WebAssembly, aber keine vollständige Unterstützung für WebGL2. Daher wird Earth mit WebAssembly nicht in Safari ausgeführt. Insbesondere benötigen einige unserer Shader GLSL 1.2. Wir hoffen, dass Google Earth auch für Safari verfügbar sein wird, sobald WebGL2 noch besser unterstützt wird.
Wir freuen uns auf weitere Einführung von WebAssembly-Funktionen
Es ist ein langer Weg, Google Earth im Web verfügbar zu machen. Vor etwa sechs Jahren haben wir mit einer ersten asm.js-basierten internen Demo begonnen, die über die Jahre hinweg gewartet und erweitert wurde. Dann wurde es in eine WebAssembly-Version von Google Earth umgewandelt, als WebAssembly zum W3C-Standard wurde.
Wir haben noch einige Möglichkeiten, zu WebAssembly und Earth zu wechseln. Wir möchten insbesondere mit Emscripten (der Toolchain zum Generieren von WebAssembly aus C++-Code) zum LLVM-Back-End wechseln. Durch diese Änderung wird die künftige Unterstützung von SIMDs sowie verbesserte Debugging-Tools wie Quellzuordnungen für Quellcode in der Quellsprache eingeführt. Wir hoffen aber auch, dass wir auch OffscreenCanvas einführen und die dynamische Arbeitsspeicherzuweisung in WebAssembly vollständig unterstützen. Wir sind jedoch auf dem richtigen Weg: WebAssembly ist eine langfristige Zukunft für die Webversion von Google Earth.
Bitte nimm dir einen Moment Zeit, um unsere Betaversion auszuprobieren. Lass uns gerne wissen, ob dir das weiterhilft, und teile uns direkt in Earth dein Feedback mit.