WebAssembly を使用した Google Earth へのクロスブラウザ アクセスの改善。
理想を言えば、デベロッパーが構築するすべてのアプリケーションが、技術に関係なくブラウザで利用できるようになります。ただし、プロジェクトをウェブに移行するには、プロジェクトが構築されたテクノロジーと、そのテクノロジーがさまざまなブラウザ ベンダーによってどの程度サポートされているかによって、障壁があります。WebAssembly(Wasm)は、W3C によって標準化されたコンパイル ターゲットです。JavaScript 以外の言語のコードベースをウェブ上で実行できるため、この問題を解決できます。
Google は、Google Earth でこの取り組みを実現しました。WebAssembly 版の Google Earth は、現在プレビュー ベータ版としてご利用いただけます。なお、これはまだ Google Earth のベータ版であり、使い慣れたほどスムーズに動作しない場合があります(通常の ウェブ版 Earth をお試しください)。このベータ版は、Chrome や他の Chromium ベースのブラウザ(Edge(Canary 版)、Opera、Firefox など)でお試しいただけます。プラットフォーム固有のアプリケーションのクロスブラウザ サポートの改善を検討している場合は、このベータ版を参考にしてください。
Google Earth に WebAssembly を選んだ理由
当初、Google Earth のほとんどは、インストールを目的としたデスクトップ アプリケーションだったため、C++ で記述されていました。その後、スマートフォンの普及に伴い、NDK と Objective-C++ を使用して C++ コードベースのほとんどを維持しながら、Android と iOS に移植しました。2017 年に地球をウェブに移植した際は、ネイティブ クライアント(NaCl)を使用して C++ コードをコンパイルし、Chrome ブラウザで実行しました。
当時、C++ コードをブラウザに移植し、Earth に必要なパフォーマンスを提供できるブラウザ テクノロジーは NaCl だけでした。残念ながら、NaCl は Chrome 専用の技術であり、他のブラウザでは採用されませんでした。現在、WebAssembly への移行が始まっています。これにより、同じコードをブラウザ間で実行できるようになります。これにより、ウェブ上でより多くのユーザーが Earth を利用できるようになります。
スレッド化に関するスレッド
WebAssembly は標準としてまだ進化しており、ブラウザは引き続き拡張され、より多くの機能が追加されています。Earth の観点から、ブラウザ間で WebAssembly のサポートに最も大きな違いがあるのは、スレッド処理のサポートです。ブラウザによってはマルチスレッドをサポートするものと、サポートしていないものがあります。Earth は、現実世界を舞台にした巨大な 3D ビデオゲームと考えてください。そのため、Google はデータを常にブラウザにストリーミングし、解凍して画面にレンダリングできるようにしています。この処理をバックグラウンド スレッドで実行できるようになったことで、ブラウザでの地球のパフォーマンスが大幅に向上しました。
マルチスレッド WebAssembly は、SharedArrayBuffer というブラウザ機能に依存しています。この機能は、Spectre と Meltdown のセキュリティ脆弱性が明らかになった後、ブラウザから削除されました。攻撃による潜在的な損害を軽減するため、Chrome のセキュリティ チームは、すべてのパソコン オペレーティング システム向けの Chrome にサイト分離を導入しました。サイト分離では、各レンダラ プロセスを 1 つのサイトのドキュメントに制限します。このセキュリティ機能が導入されたことで、Chrome ではパソコン向けの SharedArrayBuffer が再度有効になり、Chrome 版 Earth でマルチスレッド WebAssembly を使用できるようになりました。
他のブラウザでは、SharedArrayBuffer を再度有効にするために、サイト分離やその他の緩和策に取り組んでいます。それまでは、これらのブラウザで Earth はシングルスレッドで実行されます。
さまざまなブラウザでの WebAssembly の動作
Earth を移植するブラウザでの WebAssembly サポートの状況について、多くのことを学びました。WebAssembly を使用してアプリケーションを開発する場合は、さまざまなブラウザで WebAssembly がどのように機能しているかの現状を理解しておくことが重要です。
Edge
Microsoft が EdgeHTML レンダラから Chromium ベースのレンダラに移行することを決定したため、Edge は 2 つの異なる開発エクスペリエンスに分かれる寸前です。現在のところ、WebGL2 がサポートされていないため、WebAssembly 版の Google Earth ベータ版は、現在の一般公開版の Edge では動作しません。この問題は、Chromium をベースにした新しいバージョンの Edge が近日リリースされると修正されます。当面は、Edge のカナリア バージョンをダウンロードして、Earth が正常に動作することをご確認ください。
Chrome
Chrome は、デスクトップでのマルチスレッドなど、WebAssembly を強力にサポートしているため、Earth の動作がスムーズになります。ただし、Chrome では、WebAssembly でのマルチスレッドによる動的メモリ割り当てのサポートが追加される予定です。それまでは、メモリ容量が限られているデバイス(32 ビット マシンなど)で Earth が起動しない可能性があります。
Firefox
Firefox は WebAssembly を十分にサポートしていますが、マルチスレッドのサポートは無効になっています。その結果、地球の表示速度が遅くなる可能性があります。Mozilla が今後のバージョンでマルチスレッドのサポートを復活させることを期待しています。一方、Firefox は動的メモリ割り当てをサポートしています。
オペラ
Opera は、Chrome や今後のバージョンの Edge と同様に Chromium をベースにしています。ただし、現在のバージョンの Opera では、WebAssembly の単一スレッド サポートのみが提供されています。Earth は Opera でも動作しますが、パフォーマンスは若干低下します。新しいバージョンの Opera では、マルチスレッドとより堅牢な WebAssembly のサポートが期待されます。
Safari
Safari には WebAssembly の強力な実装がありますが、WebGL2 は完全にはサポートされていません。そのため、WebAssembly を使用した Earth は Safari では実行されません。特に、一部のシェーダには GLSL 1.2 が必要です。WebGL2 のサポートが改善され次第、Safari でも Earth をご利用いただけるようになります。
WebAssembly 機能のさらなる普及に期待
ウェブ上で Google Earth を利用できるようにするまでの道のりは長いものでした。約 6 年前、Google は asm.js ベースの最初の内部デモを開始し、長年にわたって維持、拡張してきました。その後、WebAssembly が W3C の標準として採用されたため、Earth の WebAssembly ビルドに変更されました。
WebAssembly と Earth の開発はまだ道半ばです。具体的には、Emscripten(C++ コードから WebAssembly を生成するツールチェーン)を使用して LLVM バックエンドに移行したいと考えています。この変更により、今後の SIMD サポートと、ソース言語コードのソースマップなどの強力なデバッグツールが実現します。また、OffscreenCanvas の採用や、WebAssembly での動的メモリ割り当ての完全なサポートも期待しています。ただし、Google は正しい方向に向かっていると考えています。WebAssembly はウェブ版 Earth の長期的な未来です。
ぜひbetaをお試しください。使用感や動作について、Google Earth で直接フィードバックを送信してください。