【问题标题】:Emscripten: Customize the generated js so it loads the .wasm file in a custom wayEmscripten:自定义生成的 js,使其以自定义方式加载 .wasm 文件
【发布时间】:2020-05-07 13:18:47
【问题描述】:

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

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

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

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

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

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

我知道我只能通过

生成.wasm文件

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

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

【问题讨论】:

  • 您支持的最旧的浏览器是什么?如果您的浏览器支持 XHR 限制,则可以绕过它
  • @AnthumChris 这不是一个典型的浏览器,它是一个沙盒环境,您的文件只能通过给定的 API 加载。

标签: javascript webassembly emscripten


【解决方案1】:

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

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

【讨论】:

  • 我在 macOS 上运行 1.39.13,它在 Web 环境的包装器中使用 XHR。
  • (格式化并再次读取代码后...)包装器首先尝试使用fetch 加载.wasm 文件,如果失败,它会调用使用XHR 的readBinary。这部分在pastebin.com/B4FJ2PSs
  • 好的,我现在会接受这个答案,因为目前似乎没有任何体面的解决方案。
猜你喜欢
  • 2021-09-01
  • 2016-02-25
  • 2018-08-26
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2014-04-04
相关资源
最近更新 更多