【发布时间】:2017-02-27 15:25:13
【问题描述】:
我在electron 中使用mmap(稍作修改的版本)在两个不同进程之间共享内存。然后我使用这个内存,以buffer 的形式上传一个 WebGL 纹理并用它来绘制东西:
buffer = mmap(196608,mmap.PROT_READ,mmap.MAP_SHARED,"shared_mmap",0)
f = function(){
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 256, 256, 0, gl.RGB, gl.UNSIGNED_BYTE, buffer);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.bindTexture(gl.TEXTURE_2D, null)
}
这是第一次完美运行。虽然我可以看到其他进程正在更改数据(如果我在控制台中评估 buffer[100]),但纹理在 WebGL 场景中保持不变。
但是,如果我将缓冲区复制到 TypedArray,它会完美运行:
arr = new Uint8Array(buffer)
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 256, 256, 0, gl.RGB, gl.UNSIGNED_BYTE, arr);
问题在于,这样做我每帧都重复复制所有数据,这违背了使用 mmap 的目的。
有没有一种方法可以使用缓冲区数据更新 WebGL 纹理,而无需每次都将其内容复制到新数组中?
【问题讨论】:
-
我不知道你可以将 node::Buffer 传递给 gl.texImage2D。但是如果是第一次工作,为什么还要复制到 Uint8Array 进行更新呢?
-
我第一次工作,但它没有更新缓冲区中的新信息。存储在缓冲区中的信息会发生变化,因为它基本上是共享内存,但不知何故 texImage2D 没有意识到这一点。
-
您找到解决方案了吗?我的节点本机模块呈现类似的情况,该模块渲染到 node::Buffer 一个 YUV 表面,然后通过 webgl 画布显示......我可以让它工作的唯一方法是创建一个不同的节点::每帧的缓冲区(指向相同的数据)。
标签: javascript webgl electron