我在mmap中使用electron的略微修改版本来共享两个不同进程之间的内存。然后我使用这个内存,以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纹理,而不是每次都将其内容复制到新数组?