使用 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:“模块不是对象或函数”