使用 WebAssembly 改善 Google 地球跨瀏覽器存取體驗。
在理想情況下,開發人員開發的每一個應用程式 (無論採用何種技術) 都可以透過瀏覽器存取。但將專案推廣到網路時有一些障礙,這取決於他們所使用的技術,以及不同的瀏覽器廠商對於這項技術的支援程度。WebAssembly (Wasm) 是 W3C 標準化的編譯目標,可讓我們透過網路上 JavaScript 以外的語言執行程式碼集,協助我們解決這項問題。
我們便已藉由 Google 地球來解決這個問題,歡迎在 WebAssembly 上體驗預先發布版。請注意,目前 Google 地球仍處於 Beta 版測試階段,因此顯示的體驗可能與您慣用的不同 (歡迎試用一般的Google 地球網頁版)。你可以透過 Chrome 和其他以 Chromium 為基礎的瀏覽器進行這項 Beta 版測試,其中包括 Edge (Canary 版)、Opera 以及 Firefox。如要為平台專用的應用程式尋找更完善的跨瀏覽器支援,不妨考慮這款 Beta 版功能。
我們選擇 Google 地球中的 WebAssembly 原因
我們最初在 C++ 中編寫大部分的 Google 地球,因為它是供安裝的桌面應用程式。然後,我們終於能夠把智慧型手機移植到 Android 和 iOS 上,因為智慧型手機會拿著手機,使用 NDK 和 Objective-C++ 保留大部分 C++ 程式碼集。 2017 年,我們將 Google 地球引進網路時,我們使用 Native Client (NaCl) 編譯 C++ 程式碼,然後在 Chrome 瀏覽器中執行。
當時,NaCl 是唯一能夠將 C++ 程式碼移植到瀏覽器的瀏覽器,並提供地球所需效能類型。遺憾的是,NaCl 是僅限 Chrome 的技術,從未跨瀏覽器採用此技術。現在我們開始改用 WebAssembly,這樣就能在不同的瀏覽器中執行相同的程式碼。這表示 Google 地球將開放更多網路使用者使用。
執行緒上的討論串
WebAssembly 仍在持續演進,瀏覽器也持續擴充,提供更多功能與功能。從地球的角度來看,瀏覽器之間支援 WebAssembly 最顯著的差異,在於支援執行緒。部分瀏覽器支援多執行緒。你可以將地球視為現實世界的大型 3D 電玩遊戲,因此我們會持續將資料串流至瀏覽器、進行解壓縮,準備在螢幕上顯示資料。和背景執行緒執行這些作業後,Google 地球在瀏覽器中的效能表現明顯提升。
多執行緒 WebAssembly 需要名為 SharedArrayBuffer 的瀏覽器功能,該功能是在 Spectre 和 Meltdown 安全漏洞揭露後,就會從瀏覽器中提取。為降低可能遭受攻擊的潛在損害,Chrome 的安全性團隊在所有電腦作業系統的 Chrome 中推出了網站隔離功能。網站隔離功能會限制每個轉譯器程序只能處理來自單一網站的文件。有了這項安全防護功能,Chrome 即可重新啟用電腦版 SharedArrayBuffer,以便將多執行緒 WebAssembly 與 Google 地球 Chrome 版搭配使用。
其他瀏覽器正在處理網站隔離或其他緩解,以重新啟用 SharedArrayBuffer。在此期間,Google 地球會在這些瀏覽器中執行單一執行緒作業。
WebAssembly 如何搭配不同瀏覽器運作
我們在移植 Google 地球的瀏覽器上,發現了很多 WebAssembly 支援狀態。如果您要使用 WebAssembly 開發應用程式,請務必瞭解 WebAssembly 在不同瀏覽器上的目前運作狀態。
Edge
Edge 將在 Microsoft 從 EdgeHTML 轉譯器移至 Chromium 型轉譯器的選擇,逐漸成為兩種不同的開發體驗。由於缺乏 WebGL2 支援,因此 WebAssembly 上的 Google 地球 Beta 版目前無法在目前的 Edge 公開版本上執行。我們將在近期 (以 Chromium 為基礎) 推出新版 Edge 後修正這項問題。在此期間,您可以下載 Edge Canary 版本,瞭解 Google 地球運作順暢。
Chrome
Chrome 支援 WebAssembly (包括電腦版的多執行緒),因此 Google 地球的執行速度會更順暢。不過,我們期待 Chrome 在 WebAssembly 中,新增多執行緒的動態記憶體配置支援。在此之前,Google 地球可能無法在記憶體有限的裝置上 (例如 32 位元電腦) 啟動。
Firefox
Firefox 提供良好的 WebAssembly 支援,但已停用多執行緒支援。因此,Google 地球的使用體驗會比較慢。我們期待 Mozilla 在日後的版本中重新支援多執行緒。此外,Firefox 也支援動態記憶體配置。
歌劇
Opera 和 Chrome 一樣以 Chromium 為基礎,搭配即將推出的 Edge 版本。不過,目前版本的 Opera 僅提供單一執行緒對 WebAssembly 的支援。地球可在 Opera 環境中運作,但使用體驗有點受損。希望新版本的 Opera 能支援多執行緒和更強大的 WebAssembly 支援。
Safari
Safari 是可支援強式 WebAssembly 的實作方式,但不支援 WebGL2 完整支援。因此,支援 WebAssembly 的 Google 地球無法在 Safari 中執行。具體來說,部分著色器需要 GLSL 1.2。我們希望在 Safari 上也能使用 Google 地球,一旦我們新增更完善的 WebGL2 支援,
期待更多人採用 WebAssembly 功能
過去一直以來,Google 地球都奠定良好基礎,才能在網路上使用 Google 地球。大約六年前,我們從推出初始的 asm.js 內部示範模式開始,多年來持續受到維護及擴大。後來隨著 WebAssembly 成為 W3C 採用的標準,被轉換成地球的 WebAssembly 版本。
我們還有更多方法可以支援 WebAssembly 和 Google 地球。具體來說,我們想使用 Emscripten 移至 LLVM 後端,也就是透過 C++ 程式碼產生 WebAssembly 的工具鍊。這項變更將帶來日後的 SIMD 支援功能,以及更強大的偵錯工具,例如原文語言程式碼來源對應。我們也希望看到其他做法,採用 OffscreenCanvas,以及 WebAssembly 中動態記憶體配置的完整支援。不過,我們明白現在正朝正確的方向邁進:WebAssembly 是 Google 地球網路世界的長期未來。
請花點時間試用測試版。歡迎直接在 Google 地球中提供意見,讓我們瞭解這項功能的運作方式。