opengl es2: преимущества использования буферных объектов вершин (VBO)

Я использую glVertexAttribPointer для загрузки моих данных вершин каждый кадр (~242 КБ), это занимает около 8 мс.
Получу ли я какое-либо увеличение производительности, используя VBO?
Я думаю, что ответ НЕТ, так как мне все еще нужно загрузить все данные.
Единственный способ получить прирост производительности - это если glBufferData загружает данные быстрее, чем glVertexAttribPointer
Это тот случай?

1 ответ

Решение

Если у вас есть статические данные вершин, то VBO имеет очень явное преимущество в производительности, потому что данные хранятся в доступной памяти GPU.

При использовании glVertexAttribPointer без VBOs драйвер должен копировать ваши данные вершин в доступную для GPU память каждый кадр. Существует две причины, по которым клиентские массивы требуют копирования

  1. GPU не имеет доступа ко всей вашей памяти. Он может видеть только те страницы, которые драйвер GPU сопоставил с ним.
  2. OpenGL обещает, что вы можете изменить память клиентского массива после возврата glDraw*, но рендеринг с помощью графического процессора происходит асинхронно после возврата.

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

Другие вопросы по тегам