在 Firefox 上使用 WebAssembly 要了解的 6 件事
WebAssembly 是一種可移植的執行格式,由於它能夠以近乎原生的速度在瀏覽器中執行應用而引起了人們的極大興趣。WebAssembly 本質上有一些特殊的屬性和局限性。但是,通過將其與其他技術結合,將出現全新的可能性,尤其是與瀏覽器中的遊戲有關的可能性。
本文介紹了在 Firefox 上運行 WebAssembly 的概念、可能性和局限性。
沙盒
WebAssembly 有 嚴格的安全策略。 WebAssembly 中的程序或功能單元稱為模塊。每個模塊實例都運行在自己的隔離內存空間中。因此,即使同一個網頁載入了多個模塊,它們也無法訪問另一個模塊的虛擬地址空間。設計上,WebAssembly 還考慮了內存安全性和控制流完整性,這使得(幾乎)確定性的執行成為可能。
Web API
通過 JavaScript Web API 可以訪問多種輸入和輸出設備。根據這個 提案,將來可以不用繞道到 JavaScript 來訪問 Web API。C++ 程序員可以在 Emscripten.org 上找到有關訪問 Web API 的信息。Rust 程序員可以使用 rustwasm.github.io 中寫的 wasm-bindgen 庫。
文件輸入/輸出
因為 WebAssembly 是在沙盒環境中執行的,所以當它在瀏覽器中執行時,它無法訪問主機的文件系統。但是,Emscripten 提供了虛擬文件系統形式的解決方案。
Emscripten 使在編譯時將文件預載入到內存文件系統成為可能。然後可以像在普通文件系統上一樣從 WebAssembly 應用中讀取這些文件。這個 教程 提供了更多信息。
持久化數據
如果你需要在客戶端存儲持久化數據,那麼必須通過 JavaScript Web API 來完成。請參考 Mozilla 開發者網路(MDN)關於 瀏覽器存儲限制和過期標準 的文檔,了解不同方法的詳細信息。
內存管理
WebAssembly 模塊作為 堆棧機 在線性內存上運行。這意味著堆內存分配等概念是沒有的。然而,如果你在 C++ 中使用 new
或者在 Rust 中使用 Box::new
,你會期望它會進行堆內存分配。將堆內存分配請求轉換成 WebAssembly 的方式在很大程度上依賴於工具鏈。你可以在 Frank Rehberger 關於 WebAssembly 和動態內存 的文章中找到關於不同工具鏈如何處理堆內存分配的詳細分析。
遊戲!
與 WebGL 結合使用時,WebAssembly 的執行速度很高,因此可以在瀏覽器中運行原生遊戲。大型專有遊戲引擎 Unity 和虛幻 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,但仍然值得一看。
via: https://opensource.com/article/21/3/webassembly-firefox
作者:Stephan Avenwedde 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive