如何在JS中创建WebAssembly.Memory,然后在C中访问它?

时间:2018-08-27 19:23:40

标签: javascript webassembly

我在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编写的。

0 个答案:

没有答案