You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需wasm-bindgen,向Rust生成的WASM传递共享数组缓冲区

问题:Web Worker中传递共享数组缓冲区给Rust WASM内核无预期效果

需求背景

希望在Web Worker中将共享数组缓冲区传递给轻量Rust处理内核,仅做数值处理,因此不想引入wasm-bindgen的复杂性。

Rust实现代码(sim.rs)

#![no_main]

#[no_mangle]
pub unsafe extern fn run(world: *mut i32) -> i32 {
        // 注:此处world.offset_from(ptr::null())始终为0
        world.add(1).write(255);
        world.read_volatile()
}

编译命令

rustc --target=wasm32-unknown-unknown sim.rs

编译无错误,生成sim.wasm文件。

Web Worker中的调用代码

const wasm = await WebAssembly.instantiateStreaming(...)
const calls = wasm.instance.exports

const mem = new Int32Array(5)
mem[0] = 7
console.log('test', calls.run(mem.buffer)) // 实际打印0,预期打印7
console.log(mem) // 实际打印Int32Array(5) [7, 0, 0, 0, 0],预期为[7, 255, 0, 0, 0]

核心痛点

实际使用的缓冲区接近4GB,必须避免每帧处理时复制数据,确认这是WASM的典型应用场景,理论上可行。

已尝试的方案

  • 创建WASM模块时将内存设为全局变量,但Rust无法读取数组,因为缓冲区不在WASM可访问的线性内存中。
  • 考虑用WAT编写功能,但找不到模块级导入全局变量的相关文档。

内容的提问来源于stack exchange,提问作者DDR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:37:05