2015-08-26 4 views
3

Чтобы обновить мои однородные объекты буфера, я использую glBufferSubData. Быстрее ли использовать glBufferSubData или glMapBuffer с glUnmapBuffer?Это лучше glBufferSubData или glMapBuffer

+1

Это зависит от варианта использования. Вам придется протестировать его для вашего дела. – BDL

+0

Хорошо, я сделал несколько тестов, и кажется, что в моем случае 'glMapBuffer' работает медленнее, чем' glBufferSubdata': с 'glMapBuffer' примерно на 10FPS меньше, чем с' glBufferSubdata' – zeb

+0

@zeb: на самом деле это звучит так, как будто нет если вы загружаете данные достаточно часто, чтобы это было большим узким местом. Посмотрите на мульти-буферизацию или сиротство вместо того, чтобы создавать конфликты ресурсов (очереди с использованием ваших данных по сравнению с текущим фреймом). OpenGL Wiki [обсуждает это] (https://www.opengl.org/wiki/Buffer_Object_Streaming) и будет хорошим местом для начала. –

ответ

0

Хорошо, что вам не нужно копировать данные сначала в массив, а затем использовать glBufferSubData, чтобы заполнить буфер opengl. С glMapBuffer вы можете скопировать данные непосредственно в часть памяти, которую opengl будет извлекать на GPU, когда это необходимо. С моей точки зрения, там glMapBuffer должен быть быстрее, если вы хотите заполнить большой буфер, который будет часто обновляться. Также важно, как вы копируете данные в буфер между glMapBuffer и glUnmapBuffer.

Если вы указали нам код, который используете glMapBuffer и насколько велики данные, тогда мы можем судить об этом проще. Во всяком случае, в конце измерения могут показать вам, какой из них лучше.

ОБНОВЛЕНИЕ:OpenGL Insight Asynchronous Buffer Transfer Chapter. В этой главе могут быть интересны функции implicit synchronization функций и glSubBufferData.

+0

Даже с 'glMapBuffer' копирует данные в массив памяти процессора. Разница лишь в том, что 'glBufferSubData' использует выделенный пользователем массив, а с помощью' glMapBuffer' драйвер выделяет его. – BDL

+0

@BDL Именно это я и имел в виду. «вы можете скопировать данные непосредственно в часть памяти, которую opengl будет извлекать на GPU, когда это необходимо». по памяти я имел в виду системную память, а не память GPU. OpenGL всегда создает буферы в системной памяти и извлекает данные на GPU, когда это необходимо. – mmostajab

+0

Но вывод неверен: при копировании большого сегмента памяти в gpu 'glMapBuffer' вам необходимо скопировать данные из его исходного местоположения в отображаемую память процессора (которая уже может быть медленной). Затем сопоставленная память копируется в gpu. С помощью 'glBufferSubData' исходная память может быть скопирована непосредственно в gpu. – BDL

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