opengl es2: преимущества использования буферных объектов вершин (VBO)
Я использую glVertexAttribPointer для загрузки моих данных вершин каждый кадр (~242 КБ), это занимает около 8 мс.
Получу ли я какое-либо увеличение производительности, используя VBO?
Я думаю, что ответ НЕТ, так как мне все еще нужно загрузить все данные.
Единственный способ получить прирост производительности - это если glBufferData загружает данные быстрее, чем glVertexAttribPointer
Это тот случай?
1 ответ
Если у вас есть статические данные вершин, то VBO имеет очень явное преимущество в производительности, потому что данные хранятся в доступной памяти GPU.
При использовании glVertexAttribPointer без VBOs драйвер должен копировать ваши данные вершин в доступную для GPU память каждый кадр. Существует две причины, по которым клиентские массивы требуют копирования
- GPU не имеет доступа ко всей вашей памяти. Он может видеть только те страницы, которые драйвер GPU сопоставил с ним.
- OpenGL обещает, что вы можете изменить память клиентского массива после возврата glDraw*, но рендеринг с помощью графического процессора происходит асинхронно после возврата.
Данные VBO распределяются драйвером и отображаются на графический процессор. Это позволяет избежать копий, если вы сохраняете те же данные вершин. Обновления также могут быть оптимизированы, если вы обновляете только часть массива вершин с помощью glBufferSubData. (например, обновлять только координаты текстуры без обновления положения вершины)