我最近开始尝试将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