如何将自定义内存对象传递给WebAssembly?

时间:2020-10-17 11:33:28

标签: javascript 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
  
});

这里是小提琴https://webassembly.studio/?f=t4fgszgzy9

背景:我有一个较大的(64MB)Uint32Array,我想将一些处理委托给C / C ++,而不必每次都复制整个数组,因为在循环中复制数据的开销会破坏此优化的目的。

为什么要使用SharedArrayBuffer?我也在WebWorkers中使用这些数据,我发现它比传输对象更优雅。

1 个答案:

答案 0 :(得分:1)

想必您已经构建了一个wasm模块来导出其内存而不是导入?在这种情况下,您正在传递的环境中的内存将被忽略。

如果是这种情况,可以通过wasm-objdump查看。

您使用什么工具来构建模块。如果要与wasm-ld链接,如果要导入内存,可以将--import-memory传递给链接器。