我们如何将 Google 地球带入网络

通过 WebAssembly 改进了跨浏览器访问 Google 地球的体验。

Jordon Mears
Jordon Mears

在理想情况下,开发者构建的每个应用(无论采用何种技术)都可以在浏览器中使用。不过,将项目移植到 Web 上存在一些障碍,具体取决于项目的构建技术以及各种浏览器供应商对该技术的支持程度。WebAssembly (Wasm) 是由 W3C 标准化的编译目标,可让我们在 Web 上运行 JavaScript 以外语言的代码库,从而帮助我们解决此问题。

我们正是通过 WebAssembly 技术实现了这一点,Google 地球现已推出 WebAssembly 测试版预览版。请注意,这仍是 Google 地球的 Beta 版,可能不如您习惯的那么流畅(请试用常规的 Google 地球网页版)。您可以在 Chrome 和其他基于 Chromium 的浏览器(包括 Edge [Canary 版]、Opera 和 Firefox)中试用此 Beta 版。如果您也希望为特定平台的应用提供更好的跨浏览器支持,不妨参考此 Beta 版。

为何为 Google 地球选择 WebAssembly

我们最初使用 C++ 编写了 Google 地球的大部分内容,因为它是一款需要安装的桌面应用。随着智能手机的普及,我们将 Google 地球移植到了 Android 和 iOS 平台,并使用 NDKObjective-C++ 保留了大部分 C++ 代码库。2017 年,我们将 Google 地球引入了 Web 平台,并使用 Native Client (NaCl) 编译 C++ 代码并在 Chrome 浏览器中运行。

当时,NaCl 是唯一可让我们将 C++ 代码移植到浏览器并提供 Earth 所需性能的浏览器技术。遗憾的是,NaCl 是一项仅适用于 Chrome 的技术,从未在其他浏览器中采用。现在,我们开始改用 WebAssembly,这样我们就可以使用相同的代码在各种浏览器中运行。这意味着,更多网民将可以使用 Google 地球。

显示埃菲尔铁塔的 Google 地球屏幕截图

线程处理相关线程

WebAssembly 作为一项标准仍在不断发展,浏览器也不断扩展,提供更多功能。从 Earth 的角度来看,浏览器之间对 WebAssembly 支持的最大差异在于对线程的支持。有些浏览器支持多线程,有些则不支持。不妨将地球视为一个巨大的 3D 真实世界视频游戏。因此,我们会不断将数据流式传输到浏览器,对其进行解压缩,并使其准备好呈现到屏幕上。能够在后台线程上执行此工作,显著提升了 Google 地球在浏览器中的性能

多线程 WebAssembly 依赖于一项名为 SharedArrayBuffer 的浏览器功能,该功能在 Spectre 和 Meltdown 安全漏洞被披露后从浏览器中移除。为减少攻击造成的潜在损害,Chrome 安全团队在适用于所有桌面操作系统的 Chrome 中引入了网站隔离功能。网站隔离功能会将每个呈现进程限制为处理来自单个网站的文档。在启用此安全功能后,Chrome 重新启用了桌面版 SharedArrayBuffer,这让我们能够在 Chrome 版 Google 地球中使用多线程 WebAssembly。

其他浏览器正在研究网站隔离或其他缓解措施,以便重新启用 SharedArrayBuffer。与此同时,Google 地球在这些浏览器中以单线程方式运行。

WebAssembly 如何与不同浏览器搭配使用

我们深入了解了移植 Earth 的浏览器中 WebAssembly 支持的状态。如果您打算使用 WebAssembly 开发应用,请务必了解 WebAssembly 与不同浏览器的当前工作方式。

Edge

由于 Microsoft 选择从 EdgeHTML 呈现引擎改为基于 Chromium 的呈现引擎,Edge 即将分化为两种不同的开发体验。目前,由于缺少对 WebGL2 的支持,WebAssembly 版 Google 地球 Beta 版无法在当前的公开版 Edge 上运行。基于 Chromium 的新版 Edge 即将发布,届时该问题将得到解决。与此同时,您可以下载 Edge Canary 版,看看地球能否正常运行。

Chrome

Chrome 对 WebAssembly 提供了强大的支持,包括桌面设备上的多线程,因此您可以期待 Google 地球的运行更加流畅。不过,我们期待 Chrome 在 WebAssembly 中添加对多线程的动态内存分配支持。在此之前,内存有限的设备(例如 32 位机器)上可能无法启动 Google 地球。

Firefox

Firefox 对 WebAssembly 提供了良好的支持,但已停用对多线程的支持。因此,您可能会发现 Google 地球的运行速度变慢。我们期待 Mozilla 在未来的版本中恢复对多线程的支持。好消息是,Firefox 支持动态内存分配。

Opera

与 Chrome 和即将发布的 Edge 版本一样,Opera 也是基于 Chromium 构建的。不过,Opera 的当前版本仅支持单线程 WebAssembly。您可以在 Opera 中运行 Google 地球,但体验会有所下降。希望较新版本的 Opera 将支持多线程并提供更强大的 WebAssembly 支持。

Safari

Safari 对 WebAssembly 的实现非常强大,但对 WebGL2 的支持不够完善。因此,支持 WebAssembly 的 Google 地球无法在 Safari 中运行。具体而言,我们的某些着色器需要 GLSL 1.2。我们希望在添加对 WebGL2 的更好支持后,地球也可以在 Safari 上使用。

期待 WebAssembly 功能的更多采用

我们花了大量时间才将 Earth 引入到 Web 平台。大约 6 年前,我们从一个基于 asm.js 的内部初始演示开始,并在几年间对其进行了维护和扩展。随着 WebAssembly 成为 W3C 采用的标准,该版本随后便转换为 WebAssembly 版 Google 地球。

WebAssembly 和 Google 地球仍有许多工作要做。具体而言,我们希望使用 Emscripten(用于通过 C++ 代码生成 WebAssembly 的工具链)迁移到 LLVM 后端。此更改将支持未来的 SIMD,以及更强大的调试工具,例如适用于源语言代码的源代码映射。我们还希望看到 WebAssembly 采用 OffscreenCanvas 并全面支持动态内存分配。但我们知道,我们走在正确的道路上:WebAssembly 是 Earth 在 Web 上的长期未来。

请抽出一点时间试用我们的beta。请直接在 Google 地球中提供反馈,告诉我们您使用该功能的体验。