Есть два очень взаимосвязанных аспекта к этому:
- Сокращение использования памяти.
- Избегайте ненужного копирования данных, что может повредить производительность.
Вызов glBufferData()
с данными передается в включает в себя следующее:
- Вы выделяете буферную память для хранения данных.
- Вы сохраняете свои данные в этом буфере, который вы выделили.
- Когда вы вызываете
glBufferData()
, реализация OpenGL выделяет память для данных.
- Реализация OpenGL копирует данные из вашего буфера в собственное распределение.
Сравните это с тем, что происходит, когда вы делаете то же самое с отображением буфера:
- При вызове
glBufferData()
, реализация OpenGL выделяет память для данных.
- Когда вы вызываете
glMapBuffer()
, реализация OpenGL возвращает указатель на свою память.
- Сохранение данных в этой памяти.
- Вы удалите карту памяти.
Если вы сравниваете две последовательности, у вас есть дополнительное распределение памяти в первом, что означает, что для этого требуется примерно в два раза больше памяти. И реализация OpenGL должна копировать данные буфера в первом, что не соответствует второму.
В действительности, вещи могут стать немного более сложными. В частности, в системах с выделенной графической памятью (VRAM) может быть больше копий данных. Но принцип остается, вы уменьшаете дополнительные распределения памяти и копирование.
Еще один аспект, который следует учитывать, заключается в том, что происходит за пределами первоначального использования буфера, если вы хотите изменить содержимое буфера после его использования. Опять же, glMapBuffer()
, как правило, уменьшает количество дополнительных копий данных, но может возникнуть цена нежелательной синхронизации. Поэтому было бы более эффективно заплатить цену за дополнительную копию, необходимую для glBufferData()
или glBufferSubData()
, чтобы избежать точек синхронизации.
Если у вас есть более сложные случаи, когда вы часто изменяете данные буфера, вам действительно нужно начинать бенчмаркинг, и вы должны ожидать различия между поставщиками. Вы также можете изучить схемы, в которых вы используете сопоставление буферов, но используйте пул буферов, которые вы используете вместо одного буфера, чтобы уменьшить/избежать штрафа за производительность при синхронизации.
В дополнение к этому, если вы работаете на устройствах, в которых приводятся энергетические/тепловые соображения, вам может потребоваться измерить потребление энергии в дополнение к простоте скорости выполнения. Потому что самое быстрое решение может быть не самым эффективным.
Скорее всего, будут различия в графических картах и драйверах. Единственный способ узнать наверняка - это измерить. Но в целом, 'glBufferData', вероятно, будет работать лучше. –
Спасибо ... Я проверю его –