2016-11-26 5 views
1

Когда я использую glMapBuffer, я получаю буфер с поплавком (байтом) в качестве возвращаемого типа, который я могу использовать для изменения данных на стороне сервера.Преимущество использования glMapBuffer

Но есть ли преимущества в производительности?

У меня есть пример

подход 1: создать поплавок буфер вершинных данных и передать его glBufferData непосредственно.

подход 2: размещает пространство с помощью glBufferData и я не прохожу никаких данных ... я получаю ссылку на буфер флоит ... я пишу значение с плавающей точкой к ней ... и я отменить отображение буфера ,

Каковы плюсы и минусы двух подходов

Могу ли я сделать то же самое на обоих?

Я думаю, что второй подход позволяет избежать дублирования буферов.

+2

Скорее всего, будут различия в графических картах и ​​драйверах. Единственный способ узнать наверняка - это измерить. Но в целом, 'glBufferData', вероятно, будет работать лучше. –

+0

Спасибо ... Я проверю его –

ответ

2

Есть два очень взаимосвязанных аспекта к этому:

  1. Сокращение использования памяти.
  2. Избегайте ненужного копирования данных, что может повредить производительность.

Вызов glBufferData() с данными передается в включает в себя следующее:

  1. Вы выделяете буферную память для хранения данных.
  2. Вы сохраняете свои данные в этом буфере, который вы выделили.
  3. Когда вы вызываете glBufferData(), реализация OpenGL выделяет память для данных.
  4. Реализация OpenGL копирует данные из вашего буфера в собственное распределение.

Сравните это с тем, что происходит, когда вы делаете то же самое с отображением буфера:

  1. При вызове glBufferData(), реализация OpenGL выделяет память для данных.
  2. Когда вы вызываете glMapBuffer(), реализация OpenGL возвращает указатель на свою память.
  3. Сохранение данных в этой памяти.
  4. Вы удалите карту памяти.

Если вы сравниваете две последовательности, у вас есть дополнительное распределение памяти в первом, что означает, что для этого требуется примерно в два раза больше памяти. И реализация OpenGL должна копировать данные буфера в первом, что не соответствует второму.

В действительности, вещи могут стать немного более сложными. В частности, в системах с выделенной графической памятью (VRAM) может быть больше копий данных. Но принцип остается, вы уменьшаете дополнительные распределения памяти и копирование.

Еще один аспект, который следует учитывать, заключается в том, что происходит за пределами первоначального использования буфера, если вы хотите изменить содержимое буфера после его использования. Опять же, glMapBuffer(), как правило, уменьшает количество дополнительных копий данных, но может возникнуть цена нежелательной синхронизации. Поэтому было бы более эффективно заплатить цену за дополнительную копию, необходимую для glBufferData() или glBufferSubData(), чтобы избежать точек синхронизации.

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

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

+0

Создание пула ... не означает частое состояние переключения? .. btw thanks –

+1

@YashwanthCB Вам понадобятся вызовы привязки буферов, но это не имеет большого значения. Больший недостаток этого подхода состоит в том, что вы, конечно, снова будете использовать больше памяти. Таким образом, преимущество использования меньше памяти уходит, но вы можете максимизировать эффективность, избегая дополнительного копирования данных. –

+0

Cool..thanks ... –

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