Является ли использование Vertex Buffer Object для очень динамических данных хорошей идеей с точки зрения производительности? - PullRequest
17 голосов
/ 03 ноября 2010

У меня много частиц, вершины которых меняются каждый кадр.Вершины в настоящее время отрисовываются с использованием массива вершин в «клиентской» памяти.Каких характеристик производительности можно ожидать, если я использую объект буфера вершин?

Поскольку мне нужно использовать несколько glBuffersubData для обновления вершин частиц, поэтому я в любом случае передаю вершины в видеопамять каждый кадр правильно (как если бы я использовал обычный массив вершин)?Есть ли польза для VBO в этом случае?

Это для устройств iOS.Фактический вызов отрисовки: glDrawElements (GL_POINTS, num_particles, GL_UNSIGNED_SHORT, pindices);

Следует ли использовать GL_STREAM_DRAW или GL_DYNAMIC_DRAW?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2010

Документация Apple , по-видимому, рекомендует VBO во всех ситуациях. Если вы используете ES 2.x, то тип буфера вершин GL_STREAM_DRAW явно используется для «когда вашему приложению необходимо создать временную геометрию, которая визуализируется небольшое количество раз, а затем отбрасывается. Это наиболее полезно, когда ваше приложение должно динамически изменять вершину данные каждого кадра таким образом, который не может быть выполнен в вершинном шейдере. " Затем непосредственно рекомендуется использовать glBufferSubData.

Логически, я полагаю, единственная разница между предоставлением данных полностью заново и отправкой их в существующий буфер GL_STREAM_DRAW или GL_DYNAMIC_DRAW заключается в том, что ваше пространство на карте памяти (GPU или CPU, в зависимости от чипа - MBX на самом деле не делают VBO, но Apple поддерживает их по другим причинам производительности), можно распределять один раз, а не выделять и освобождать каждый кадр.

Использование советов по выравниванию и упаковке, приведенных в этом документе, вероятно, даст лучшее улучшение, чем переключение на VBO, поскольку в противном случае ЦП просто нужно распаковать и перепаковать данные на glDrawElements. Хотя вполне вероятно, что вы уже знаете об этом, и я понимаю, что это не является частью вопроса - я в основном даю это как сравнительное предположение о преимуществах производительности.

1 голос
/ 03 ноября 2010

Правильно настроив VBO, вы используете оптимальный способ передачи данных в графический процессор. Таким образом, вы можете пропустить обработку некоторых драйверов. Единственный способ увидеть, насколько вы получаете улучшение, - это измерить. Это отличается от карты к карте.

Инструкции по VBO см. В следующих статьях: Руководство по VBO

EDIT Забыл ответить на вопрос: да, это хорошая идея. Но первая мера.

...