无需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
相关产品推荐
相关产品推荐

