使用 Emscripten Worker API 传输数据而无需复制

Posted

技术标签:

【中文标题】使用 Emscripten Worker API 传输数据而无需复制【英文标题】:Transferring data using Emscripten Worker API without copying 【发布时间】:2015-04-03 06:15:42 【问题描述】:

有没有办法让 Emscripten 在 Web Worker 和主 UI 线程之间传输而不是复制数据?

Emscripten 有一个API that manages communication between Web Workers,我相信它只是在底层使用了postMessage / onmessage 机制。查看Emscripten Worker API 的源代码,它似乎在调用postMessage使用transferList 选项,因此数据被复制。

实际上,我认为它至少被复制了两次:首先是由线程之间的浏览器复制,然后是 second time by Emscripten 将其复制到 Emscripten 管理的堆空间中。而如果你想让数据在回调后继续存在于接收端,则必须进行第三次复制,因为according to the docs传递给回调的数据只保证在回调期间存在。

从顶部重复我的问题:有没有办法让 Emscripten 通过在网络工作者和主 UI 线程之间传输而不是复制数据来避免所有这些复制?

【问题讨论】:

【参考方案1】:

如果您使用SharedArrayBuffer,这是可能的。最近,Emscripten 的家伙添加了experimental support for pthread in Emscripten,它使用了这个功能。但是,目前只有 Firefox nightly 支持 SharedArrayBuffers,所以还没有被广泛采用。

【讨论】:

以上是关于使用 Emscripten Worker API 传输数据而无需复制的主要内容,如果未能解决你的问题,请参考以下文章

Web Worker 中的 Emscripten WASM:“模块不是对象或函数”

如何直接从原生 JavaScript 前端与 Emscripten Web Worker 交互

emscripten webworker 的最小工作示例

Emscripten教程之Emscripten的运行时环境

Emscripten教程之Emscripten的运行时环境

web worker 比原生线程更重还是更轻