2016-10-18 2 views
1

Я использую (слегка измененную версию) mmap в electron для обмена памятью между двумя различными процессами. Затем я использую эту память в виде 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

Я не знал, что вы можете передать узел :: Buffer to 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, а не shared' –

Смежные вопросы