2016-10-18 50 views
1

我在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纹理,而不是每次都将其内容复制到新数组?

+0

我不知道你可以传递一个node :: Buffer到gl.texImage2D。但是如果它第一次工作,为什么你需要将它复制到Uint8Array进行更新? – pleup

+0

我第一次工作,但不会使用缓冲区中的新信息进行更新。存储在缓冲区中的信息因为基本上是共享内存而发生变化,但不知何故,texImage2D并没有意识到这一点。 –

回答

0

您不复制数据,使用new Uint8Array(buffer),您正在为相同数据创建新的引用。

Here你可以阅读更多关于DataViews。

+0

但是[在节点文档中,它另有说明](https://nodejs.org/api/buffer.html#buffer_buffers_and_typedarray):'将Buffer对象的内存复制到TypedArray中,而不是共享的 –