我在electron中使用mmap(稍微修改后的版本)来在两个不同的进程之间共享内存。然后,我使用这块内存,在buffer的形式上传WebGL的质地和我用它来画的东西:强制从缓冲区重新加载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进行更新? – pleup
我第一次工作,但不会使用缓冲区中的新信息进行更新。存储在缓冲区中的信息因为基本上是共享内存而发生变化,但不知何故,texImage2D并没有意识到这一点。 –