在 AssemblyScript 模块和 JS 之间共享内存的正确方法是什么?



我在这里遵循这段代码,试图在AssemblyScript代码和JS:之间共享内存

let aryPtr = instance.exports.allocateF32Array(3);
let ary = new Float32Array(instance.exports.memory.buffer, aryPtr, 3);
ary[0] = 1.0;
ary[1] = 2.0;
instance.exports.addArray(aryPtr);

我的指数:

export function allocateF32Array(length: i32): Float32Array {
return new Float32Array(length);
}
export function addArray(data: Float32Array): i32 {
data[2] = data[0] + data[1];
return data.length;
}

但这导致了CCD_ 2中的CCD_。我有没有误解这是怎么回事?

我建议使用官方加载程序来实现这些目的。

在JavaScript方面:(例如node.js(

const fs = require("fs");
const loader = require("@assemblyscript/loader");
const module = loader.instantiateSync(
fs.readFileSync("optimized.wasm"),
{}
);
var ptrArr = module.__retain(module.__allocArray(module.FLOAT32ARRAY, [1, 2, 0]));
console.log('length:', module.addArray(ptrArr));
const arr = module.__getFloat32Array(ptrArr);
console.log('result:', arr[2]);
// free array
module.__release(ptrArr);

在AssemblyScript端:

export const FLOAT32ARRAY = idof<Float32Array>();
export function addArray(data: Float32Array): i32 {
data[2] = data[0] + data[1];
return data.length;
}

有点晚了,但这可能对最终来到这里的人有用。

在我看来,AssemblyScript是一种非常棒的语言,可以很容易地将WASM功能应用到JS/TS代码中。最近的0.25.1版本提供了许多类型的绑定。然而,您仍然可以自己轻松地实现绑定。

请记住,您只能在主机和WASM模块之间直接交换i32i64f32f64数据。此外,您还可以从JS/TS(主机(端访问WASM内存。

让我们研究一下代码的初始部分

let aryPtr = instance.exports.allocateF32Array(3);
let ary = new Float32Array(instance.exports.memory.buffer, aryPtr, 3);
ary[0] = 1.0;
ary[1] = 2.0;
instance.exports.addArray(aryPtr);
  • allocateF32Array(n)是从WASM导出的函数。当您使用整数参数n调用它时,它会在WASM端创建一个长度为RuntimeError: memory access out of bounds0的Float32Array,并将其指针传回主机端。指针是它在模块内存中的位置,并被分配给aryPtr
  • 然后在第二行创建一个单独的Float32Array,用作访问WASM内存的视图。因此,它将要使用的缓冲区、偏移量(指针(和长度(传递给Float32Array构造函数。现在您可以通过ary访问WASM内存的相关部分。您在ary上所做的任何修改实际上都将发生在WASM端Float32Array
  • 对索引0和1进行一些分配
  • 用它的指针调用另一个导出的函数addArray(ptr)

现在您应该实现要导出的allocateF32ArrayaddArray(函数。

  • 创建addArray0与AssemblyScript(AS(中的普通JS非常相似

allocateF32Array(n):

export function allocateF32Array(length: i32): i32 {
const arr : Float32Array = new Float32Array(length);
return changetype<i32>(arr); // return the pointer
}
  • 其他功能可以实现如下

addArray(ptr):

export function addArray(ptr: usize): f32 {
const arr : Float32Array = changetype<Float32Array>(ptr); // obtain Float32Array from the pointer
return arr[0] + arr[1];
}

最后,这实际上是一种原始方法,你真的不需要把它降到这么低。现在,绑定很容易在.build/release.js文件中实现,您可以像导入ESM一样从中导入导出的函数。

相关内容

  • 没有找到相关文章

最新更新