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 结合使用可在浏览器中实现本地游戏。 大型专有游戏引擎 Unity 和 Unreal Engine 4 展示了 WebGL 的可能性。 还有一些使用 WebAssembly 和 WebGL 接口的开源游戏引擎。 这里有一些例子
- 自 2011 年 11 月以来,id Tech 4 引擎(更广为人知的名称是 Doom 3 引擎)已在 GitHub 上以 GPL 许可提供。 还有一个 Doom 3 的 WebAssembly 端口。
- Urho3D 引擎提供了一些令人印象深刻的示例,可以在浏览器中运行。
- 如果您喜欢复古游戏,请尝试此Game Boy 模拟器。
- Godot 引擎也能够生成 WebAssembly。 我找不到演示,但是 Godot 编辑器已移植到 WebAssembly。
更多关于 WebAssembly 的信息
WebAssembly 是一项很有前途的技术,我相信将来我们会更频繁地看到它。 除了在浏览器中执行之外,WebAssembly 还可以用作可移植的执行格式。 Wasmer 容器主机使您能够在各种平台上执行 WebAssembly 代码。
如果您想要更多演示、示例和教程,请查看此广泛的 WebAssembly 主题集合。 Mozilla 的 游戏和演示集合虽然不专用于 WebAssembly,但仍然值得一看。
评论已关闭。