我們如何將 Google 地球與網路搭配使用(')

透過 WebAssembly 改善 Google 地球跨瀏覽器存取功能。

Jordon Mears
Jordon Mears

在理想情況下,無論開發人員採用何種技術,所有應用程式都應可在瀏覽器中使用。不過,將專案移至網頁時會遇到一些障礙,這取決於專案的建構技術,以及各瀏覽器供應商對該技術的支援程度。WebAssembly (Wasm) 是 W3C 標準化的編譯目標,可讓我們在網路上執行 JavaScript 以外語言的程式碼庫,進而解決這個問題。

我們已在 WebAssembly 上推出 Google 地球Beta 版,讓您體驗這項功能。請注意,這仍是 Google Earth 的 Beta 版,可能無法提供流暢的使用體驗 (請試試一般 Earth 網頁版)。您可以在 Chrome 和其他採用 Chromium 的瀏覽器上試用這個 Beta 版,包括 Edge (Canary 版)、Opera 和 Firefox。如果您也想為特定平台的應用程式提供更完善的跨瀏覽器支援,不妨參考這個 Beta 版。

為何選擇在 Google 地球中使用 WebAssembly

我們最初以 C++ 編寫大部分 Google 地球內容,因為這是要安裝的桌面應用程式。隨著智慧型手機的普及,我們將 Earth 移植到 Android 和 iOS 平台,並使用 NDKObjective-C++ 保留大部分的 C++ 程式碼。2017 年,我們將 Earth 移植到網頁版,並使用 Native Client (NaCl) 編譯 C++ 程式碼,並在 Chrome 瀏覽器中執行。

當時,NaCl 是唯一可讓我們將 C++ 程式碼移植至瀏覽器,並提供 Earth 所需效能的瀏覽器技術。不幸的是,NaCl 是 Chrome 專屬技術,從未在其他瀏覽器中採用。我們現在開始改用 WebAssembly,這樣一來,我們就能使用相同的程式碼,並在各瀏覽器上執行。這表示更多網站使用者將可使用 Google 地球。

地球的螢幕截圖,顯示艾菲爾鐵塔

執行緒的討論串

WebAssembly 仍在不斷演進,成為標準,瀏覽器也持續擴充更多功能。從 Google Earth 的角度來看,瀏覽器支援 WebAssembly 的最大差異在於是否支援執行緒。部分瀏覽器支援多執行緒,其他則不支援。請將地球視為真實世界的大型 3D 電玩遊戲。因此,我們會持續將資料串流至瀏覽器,並解壓縮資料,讓系統準備在螢幕上顯示。在背景執行緒上執行這項工作後,Google 地球在瀏覽器中的效能明顯提升。

多執行緒 WebAssembly 會依賴名為 SharedArrayBuffer 的瀏覽器功能,但在 Spectre 和 Meltdown 安全漏洞曝光後,這項功能已從瀏覽器中移除。為減輕攻擊可能造成的損害,Chrome 安全團隊在 Chrome 中為所有電腦作業系統推出網站隔離功能。網站隔離功能會將每個轉譯程序限制為單一網站的文件。有了這項安全性功能,Chrome 便可重新啟用電腦版的 SharedArrayBuffer,讓我們能夠在 Chrome 中使用多執行緒 WebAssembly。

其他瀏覽器正在進行網站隔離或其他因應措施,以便重新啟用 SharedArrayBuffer。在此期間,Google 地球會在這些瀏覽器中執行單執行緒。

WebAssembly 如何與不同瀏覽器搭配運作

我們已瞭解許多關於瀏覽器移植 Earth 的 WebAssembly 支援狀態。如果您打算使用 WebAssembly 開發應用程式,請務必瞭解 WebAssembly 與不同瀏覽器搭配運作的現況。

Edge

由於 Microsoft 選擇從 EdgeHTML 轉換為以 Chromium 為基礎的轉譯器,Edge 即將提供兩種不同的開發體驗。目前,WebAssembly 版 Google 地球 Beta 版無法在 Edge 的現行公開版本上執行,因為該版本不支援 WebGL2。不久後,我們會推出新版 Edge,該版本採用 Chromium 技術,這項問題就會修正。在此期間,你可以下載 Edge Canary 版本,看看 Earth 是否正常運作。

Chrome

Chrome 提供強大的 WebAssembly 支援功能,包括電腦上的多執行緒功能,因此 Google 地球的執行速度會更流暢。不過,我們期待 Chrome 在 WebAssembly 中加入支援動態記憶體配置和多執行緒功能。在此之前,如果裝置的記憶體空間有限 (例如 32 位元機器),Google 地球可能無法啟動。

Firefox

Firefox 提供良好的 WebAssembly 支援功能,但已停用多執行緒支援功能。因此,Earth 的使用體驗可能會變慢。我們期待 Mozilla 在日後的版本中恢復支援多執行緒。好消息是,Firefox 確實支援動態記憶體配置。

Opera

Opera 和 Chrome 一樣,都是以 Chromium 為基礎,而即將推出的 Edge 也是如此。不過,Opera 目前版本僅支援 WebAssembly 的單執行緒。Google 地球確實可以在 Opera 中執行,但使用體驗會有所降低。希望新版 Opera 能支援多執行緒,並提供更強大的 WebAssembly 支援。

Safari

Safari 實作 WebAssembly 的功能強大,但不完全支援 WebGL2。因此,WebAssembly 版 Earth 無法在 Safari 中執行。具體來說,部分著色器需要 GLSL 1.2。我們希望在 WebGL2 支援功能更加完善後,地球儀也能支援 Safari。

期待更多人採用 WebAssembly 功能

我們花了許多時間,才讓 Earth 在網路上提供服務。大約六年前,我們開始使用以 asm.js 為基礎的內部示範,並在多年的維護和擴充後,由於 WebAssembly 已成為 W3C 採用的標準,因此我們將該版本轉換為 Google 地球的 WebAssembly 版本。

我們仍有許多工作要完成,才能讓 WebAssembly 和 Google 地球發揮最大效益。具體來說,我們想使用 Emscripten (用於從 C++ 程式碼產生 WebAssembly 的工具鍊) 轉移至 LLVM 後端。這項變更可支援日後的 SIMD,以及更強大的偵錯工具,例如來源語言程式碼的來源對應表。我們也希望看到採用 OffscreenCanvas,並在 WebAssembly 中全面支援動態記憶體配置。但我們知道自己走在正確的道路上:WebAssembly 是 Google 地球在網路上的長期發展方向。

歡迎試用我們的beta。歡迎直接在 Google 地球中提供意見回饋,讓我們瞭解這項功能對你來說是否實用。