将数组从JS传递给AssemblyScript



我最近开始尝试将WebAssembly添加到我正在工作的应用程序中,但似乎遇到了一些麻烦。我一直得到两个错误之一:内存访问超出限制或不可达。我试图发送长度为128的Float32Array到wasm模块,但它不起作用。下面是我使用的代码示例:

zero.ts:

export function zero(arr: number[], length: number): number[] {
for (var i = 0; i < length; i++) {
arr[i] = 0;
}
return arr;
}

和编译使用以下终端命令:

asc零。t - 0 0 .wasm

然后在AudioWorkletNode中使用,如下所示:

//wasmBytes is passed in form the main thread
var mod;
var importObject = {};
WebAssembly.instantiate(wasmBytes, importObject).then((instance) => {
mod = instance.instance.exports;

var f = new Float32Array(mod.memory.buffer, 0, arr.length);
f.set(arr);
var x = mod.zero(f.byteOffset, arr.length);
});

任何帮助都将是非常感激的。

WebAssembly只能通过js-wasm边界传递数字。这就是为什么像数组这样的托管运行时对象通过Wasm线性内存传递的原因。每种可以编译成WebAssembly的语言都有自己的结构。用于表示数组、字符串等的内存布局。对这种结构进行编码和解码通常并不简单,因此有一些工具可以自动完成这些工作。自0.20.x版本以来的AssemblyScript也可以这样做。您将需要两件事-添加--exportRuntime--bindings esm标志。您可以在文档中阅读更多信息:https://www.assemblyscript.org/compiler.html#host-bindings

我也推荐这个视频:https://www.youtube.com/watch?v=H1O2j4w78j8

相关内容

  • 没有找到相关文章

最新更新