在 Firefox 上使用 WebAssembly 的 6 个须知

了解在 Firefox 上运行 WebAssembly 的机遇和限制。
88 位读者喜欢这篇文章。
Business woman on laptop sitting in front of window

图片由 Mapbox Uncharted ERG 提供, CC-BY 3.0 US

WebAssembly 是一种可移植的执行格式,由于它能够在浏览器中以接近本地的速度执行应用程序而引起了广泛的兴趣。 WebAssembly 本身具有一些特殊的属性和限制。 但是,通过将其与其他技术结合使用,可以产生全新的可能性,尤其是在浏览器中的游戏方面。

本文介绍了在 Firefox 上运行 WebAssembly 的概念、可能性和局限性。

沙箱

WebAssembly 具有严格的安全策略。 WebAssembly 中的程序或功能单元称为模块。 每个模块实例都运行其自己的隔离内存空间。 因此,即使它们加载在同一网页上,一个模块也无法访问另一个模块的虚拟地址空间。 在设计上,WebAssembly 还考虑了内存安全性和控制流完整性,从而实现了(几乎)确定性的执行。

Web API

通过 JavaScript Web API 授予对多种输入和输出设备的访问权限。 根据此提案,将来无需通过 JavaScript 绕道即可访问 Web API。 C++ 程序员可以在Emscripten.org上找到有关访问 Web API 的信息。 Rust 程序员可以使用 wasm-bindgen 库,该库记录在 rustwasm.github.io 上。

文件输入/输出

由于 WebAssembly 在沙箱环境中执行,因此在浏览器中执行时无法访问主机的文件系统。 但是,Emscripten 以虚拟文件系统的形式提供了一种解决方案。

Emscripten 使得可以在编译时将文件预加载到内存文件系统中。 然后可以从 WebAssembly 应用程序内部读取这些文件,就像在普通文件系统上一样。 此教程提供了更多信息。

持久数据

如果需要在客户端存储持久性数据,则必须通过 JavaScript Web API 完成。 有关不同方法的更多详细信息,请参阅 Mozilla 开发者网络上关于 浏览器存储限制和驱逐标准的文档。

内存管理

WebAssembly 模块以堆栈机的形式在线性内存上运行。 这意味着诸如堆内存分配之类的概念不可用。 但是,如果在 C++ 中使用new或在 Rust 中使用Box::new,则期望它会导致堆内存分配。 将堆内存分配请求转换为 WebAssembly 的方式很大程度上取决于工具链。 您可以在 Frank Rehberger 关于 WebAssembly 和动态内存的文章中找到对不同工具链如何处理堆内存分配的详细分析。

游戏!

由于其高执行速度,WebAssembly 与 WebGL 结合使用可在浏览器中实现本地游戏。 大型专有游戏引擎 UnityUnreal Engine 4 展示了 WebGL 的可能性。 还有一些使用 WebAssembly 和 WebGL 接口的开源游戏引擎。 这里有一些例子

更多关于 WebAssembly 的信息

WebAssembly 是一项很有前途的技术,我相信将来我们会更频繁地看到它。 除了在浏览器中执行之外,WebAssembly 还可以用作可移植的执行格式。 Wasmer 容器主机使您能够在各种平台上执行 WebAssembly 代码。

如果您想要更多演示、示例和教程,请查看此广泛的 WebAssembly 主题集合。 Mozilla 的 游戏和演示集合虽然不专用于 WebAssembly,但仍然值得一看。

接下来阅读
标签
User profile image.
Stephan 是一位技术爱好者,他欣赏开源,因为它能深刻洞察事物的工作原理。 Stephan 是一名全职支持工程师,主要从事工业自动化软件的专有领域。 如果可能,他会致力于基于 Python 的开源项目、撰写文章或驾驶摩托车。

评论已关闭。

知识共享许可协议本作品已根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.