我在https://webassembly.studio/?f=0r9gxzb9rdq上有一个在线演示小提琴,使用的是JS和WebAssembly之间共享的数组缓冲区。
如该答案How to access WebAssembly linear memory from C/C++中的建议,我将其声明为正在读取和写入的全局数组,以及一个用于返回起始地址的辅助函数:
const SIZE = 6 * 1000 * 1000;
int array[SIZE]
WASM_EXPORT
int* getStartByteOffset() {
return &array[0];
}
然后,在JS-land中,一旦我加载wasm文件并获取模块实例:
const SIZE = 6 * canvas.width * canvas.height;
const heap = instance.exports.memory.buffer;
const offset = instance.exports.getStartByteOffset()
const arrayView = new Int32Array(heap, offset, SIZE)
这有效,现在JS和WebAssembly可以访问此数组。但这不是我想要的方式。我事先不知道所需的数组大小(画布可能变成任何大小),所以我在愚蠢地预分配了一个足够大的大小以容纳1000x1000像素(每个像素需要六个32位宽int)。>
我想做的是在JS中计算所需的内存,然后将其作为WebAssembly.Memory传递给我。一旦我知道需要多少64k页:
fetch('../out/main.wasm').then(response => response.arrayBuffer())
.then((bytes) => {
WebAssembly.instantiate(bytes, {
env: {
memoryBase: 0,
memory: new WebAssembly.Memory({
initial: 1 + ((6 * 4 * canvas.width * canvas.height) >> 16)
})
}
}).then((wasm) => {...});
});
我不知道是使用C访问WebAssembly.Memory缓冲区的确切方法。Internet上挤满了关于API JS端工作方式的代码示例,但是我能用的所有代码示例在WebAssembly上找到的都是用WAT编写的。