如何将自定义内存对象传递给 WebAssembly?
How to pass custom Memory object to WebAssembly?
为什么我的自定义内存对象被忽略了?
let memory = new WebAssembly.Memory({ initial: 16, maximum: 16, shared: true });
console.log(memory.buffer);
// logs: SharedArrayBuffer(1048576) as expected
WebAssembly.instantiateStreaming(fetch('../out/main.wasm'), {
env: { memory }
}).then(results => {
console.log(results.instance.exports.memory.buffer);
// logs: ArrayBuffer(131072) - both size and shared parameter is being ignored
});
这里是fiddlehttps://webassembly.studio/?f=t4fgszgzy9
背景:我有一些大的 (64MB) Uint32Array,我想将一些处理委托给 C/C++ 而不是每次都复制整个数组,因为在循环中复制数据的开销会破坏目的此优化。
为什么我需要 SharedArrayBuffer?我也在 WebWorkers 中使用这些数据,我发现它比传输对象更优雅。
大概你已经构建了一个 wasm 模块,它导出它的内存而不是导入?在这种情况下,您传递的环境中的内存将被忽略。
如果是这样可以用wasm-objdump看看
您使用什么工具来构建您的模块。如果您使用 wasm-ld 进行链接,如果您希望导入内存,则可以将 --import-memory
传递给链接器。
为什么我的自定义内存对象被忽略了?
let memory = new WebAssembly.Memory({ initial: 16, maximum: 16, shared: true });
console.log(memory.buffer);
// logs: SharedArrayBuffer(1048576) as expected
WebAssembly.instantiateStreaming(fetch('../out/main.wasm'), {
env: { memory }
}).then(results => {
console.log(results.instance.exports.memory.buffer);
// logs: ArrayBuffer(131072) - both size and shared parameter is being ignored
});
这里是fiddlehttps://webassembly.studio/?f=t4fgszgzy9
背景:我有一些大的 (64MB) Uint32Array,我想将一些处理委托给 C/C++ 而不是每次都复制整个数组,因为在循环中复制数据的开销会破坏目的此优化。
为什么我需要 SharedArrayBuffer?我也在 WebWorkers 中使用这些数据,我发现它比传输对象更优雅。
大概你已经构建了一个 wasm 模块,它导出它的内存而不是导入?在这种情况下,您传递的环境中的内存将被忽略。
如果是这样可以用wasm-objdump看看
您使用什么工具来构建您的模块。如果您使用 wasm-ld 进行链接,如果您希望导入内存,则可以将 --import-memory
传递给链接器。