Emscripten:自定义生成的 js,以便以自定义方式加载 .wasm 文件

RnM*_*Mss 5 javascript emscripten webassembly

通过使用以下选项进行编译,

emcc -s WASM=1 main.cpp -o index.js

emscripten 生成一个index.wasm, 和一个 js 包装器index.js。js 包装器在浏览器中运行时加载.wasm位于同一目录中的文件。XMLHttpRequest

那么如果我需要手动加载文件该怎么办呢.wasm?加载部分似乎是硬编码在包装器中的。

以下是我需要这样做的一些情况:

  • 我需要.wasm从另一个 url(例如从 CDN)提供该文件。
  • 下载文件的 url.wasm是动态生成的。
  • 代码在XMLHttpRequest不允许的沙箱中运行,只有像getMyData('some_file').
  • 我需要将所有文件嵌入为 base64 字符串。

.wasm我知道我只能通过以下方式生成文件

emcc -s WASM=1 main.cpp -o index.wasm

但随后我丢失了包装器,这在使用 SDL 和 GLES 等 emscripten API 时并非易事。

Ant*_*ris 2

AFIK,JS 包装器调用 fetch() 而不是 XHR。如果可用,您可以使用 Service Worker 来拦截该请求并返回您想要的任何内容。

您还可以修改 Emscripten 源(我有 v1.39.13)来重写默认加载行为。在 file 中$EMSDK/upstream/emscripten/src/preamble.js,根据您的喜好修改函数getBinaryPromise()getBinary()然后进行构建,emcc以便在 WASM JS 包装器中实现自定义加载行为。