2016-10-18 49 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中,而不是共享的 –