Имеет ли смысл использовать объекты буфера вершин даже при изменении матрицы представления модели?

Я хочу получить дополнительное увеличение производительности (FPS) в моем приложении для iPhone. Я уже использую чередующиеся данные, GL_SHORT и один атлас текстуры. См. этот вопрос для получения подробной информации что я уже сделал.

Теперь я хочу взглянуть на использование VBO для повышения производительности. Согласно документации Apple OpenGL ES, это хороший шаг. Однако в нем не рассматривается, как (или если) на VBO влияют изменения в матрице представления модели. По сути, у меня один и тот же объект визуализируется в сцене несколько раз, но каждый раз с использованием немного другой матрицы представления модели. Основное различие между объектами (кроме положения в сцене) - это наложение текстуры. Все они имеют немного разные координаты текстуры.

Помогут ли VBO в этой ситуации? Следует ли выделять отдельный VBO для каждого отдельного объекта?

Обновление 1

Пока что похоже, что VBO негативно влияют на мою работу. FPS снова упал до средних и высоких 20. Я выделяю 70 VBO: 35 для данных и 35 для индексов. Я мог бы уменьшить это число до 35 для данных и одного глобального массива индексов. Я использую glBufferSubData () для обновления координат текстуры по мере необходимости.

Другая мысль - разбить все статические данные и указать GL_STATIC_DRAW для этого VBO.


person Rob Jones    schedule 10.12.2009    source источник
comment
Проводилась ли ваша оценка производительности до и после на iPhone 3G или iPod touch? Я бы не ожидал изменения частоты кадров при переходе на VBO на старых устройствах, но на графических процессорах с аппаратной поддержкой VBO частичные обновления буферного объекта могут вызвать дополнительную работу или синхронизацию в драйвере, если графический процессор не завершил чтение с него. . Акцент здесь делается на «частичном» - если вы полностью заменяете данные (т.е. на glBufferData), драйверы обычно могут позаботиться о двойной буферизации за вас.   -  person Pivot    schedule 12.12.2009
comment
Оценка проводилась на iPhone 3G.   -  person Rob Jones    schedule 12.12.2009
comment
Интересный. Я бы порекомендовал сравнить две версии в Shark, чтобы увидеть разницу во времени. Если копирование данных проблематично, другой способ обновить буферный объект - отобразить его в памяти с помощью расширения OES_mapbuffer и сгенерировать данные непосредственно в нем. Применяются те же предостережения для частичных обновлений на графических процессорах с аппаратной поддержкой VBO, поскольку вам разрешено отображать буфер и изменять только его часть, но вы можете сигнализировать, что вас не волнует старое содержимое, вызвав glBufferData с нулевой указатель перед его отображением.   -  person Pivot    schedule 13.12.2009


Ответы (1)


в нем не рассматривается, как (или если) на VBO влияют изменения в матрице представления модели.

Преобразование модель-представление происходит на графическом процессоре каждый раз, когда вы выполняете вызов отрисовки. Изменение вида модели не приводит к изменению VBO.

Основное различие между объектами (кроме положения в сцене) - это наложение текстуры. Все они имеют немного разные координаты текстуры.

Похоже, вы должны настраивать матрицу текстуры в дополнение к матрице вида модели, примерно так:

glMatrixMode(GL_TEXTURE);
// glTranslate, glRotate, etc
glMatrixMode(GL_MODELVIEW);
// glTranslate, glRotate, etc

Использование VBO обычно является хорошей идеей, но на самом деле они помогают только с iPhone третьего поколения. Они не особо помогают со старыми iPhone.

Следует ли выделять отдельный VBO для каждого отдельного объекта?

Обычно более эффективно уменьшить количество VBO в вашем приложении. Вместо того, чтобы делать несколько вызовов glBindBuffer, вы можете предоставлять уникальные смещения каждый раз, когда вызываете glDrawArrays или glDrawElements.

person prideout    schedule 10.12.2009