首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过WASM构建新的锈蚀Vec时,JavaScript ArrayBuffer会“分离”

通过WASM构建新的锈蚀Vec时,JavaScript ArrayBuffer会“分离”
EN

Stack Overflow用户
提问于 2018-08-03 01:33:23
回答 1查看 1.1K关注 0票数 5

其基本思想是返回一个指针,然后在每个视频帧创建Vec后使用该指针显示图像:

JavaScript:

代码语言:javascript
复制
var ptr = exports.alloc(size);
let bytes = new Uint8ClampedArray(exports.memory.buffer, ptr, size);
let image = new ImageData(bytes, 320, 240);

function tick() {
    requestAnimationFrame(tick);
    ctx.drawImage(video, 0, 0, width, height);
    let imageData = ctx.getImageData(0, 0, width, height).data;
    bytes.set(imageData);
    exports.create_vector();
    ctx.putImageData(img, 0, 0);
}

生锈:

代码语言:javascript
复制
#[no_mangle]
pub extern "C" fn alloc(capacity: usize) -> *mut c_void {
    let mut buf = Vec::with_capacity(capacity);
    let ptr = buf.as_mut_ptr();
    mem::forget(buf);
    return ptr as *mut c_void;
}

#[no_mangle]
pub extern "C" fn create_vector() {
    let _: Vec<u8> = Vec::with_capacity(320 * 240);
}

Here is the actual code

以下是错误消息:

Chrome:

代码语言:javascript
复制
Uncaught TypeError: Cannot perform %TypedArray%.prototype.set on a detached ArrayBuffer
    at Uint8ClampedArray.set (<anonymous>)
    at tick

Safari:

代码语言:javascript
复制
This webpage was reloaded because a problem occurred

Mozilla:

代码语言:javascript
复制
DOMException: "An attempt was made to use an object that is not, or is no longer, usable"

TypeError: Underlying ArrayBuffer has been detached from the view

主要的罪魁祸首似乎是:

代码语言:javascript
复制
let bytes = new Uint8ClampedArray(exports.memory.buffer, ptr, size);
// ...
    exports.create_vector();
// ...

例如,当我在调用exports.create_vector之后再次尝试使用ptr时,浏览器崩溃。

这里出了什么问题?有解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 08:22:29

当您分配一个新的缓冲区,而WASM“进程”没有为它分配足够的内存时,浏览器将分配一个新的、更大的缓冲区,并将所有数据从旧位置复制到其中。它在WASM解释器中是相当透明的,但是所有传递给JavaScript (用来构造Uint8ClampedArray)的指针都会失效。据我所知,有两种解决方案:

  • 在初始化时在WASM“进程”中分配足够的内存,并立即解除分配,这样只要内存使用率低于所选大小,指针就不会失效。
  • 跟踪传递给JavaScript的缓冲区,并在出现此类错误时“续订”指针。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51659292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档