После многих лет прослушивания об объектах Vertex Buffer Objects (VBO) я, наконец, решил поэкспериментировать с ними (очевидно, мои вещи обычно не критичны к производительности...)
Я опишу свой эксперимент ниже, но, если коротко, я наблюдаю неразличимую производительность между «простым» прямым режимом (glBegin()/glEnd()), массивом вершин (на стороне процессора) и VBO (на стороне графического процессора). режимы рендеринга. Я пытаюсь понять, почему это так, и при каких условиях я могу ожидать, что VBO значительно затмят своих примитивных (каламбур) предков.
Детали эксперимента
Для эксперимента я создал (статическое) трехмерное гауссово облако из большого количества точек. Каждая точка имеет информацию о вершине и цвете, связанную с ней. Затем я вращал камеру вокруг облака в последовательных кадрах, что-то вроде «орбитального» поведения. Опять же, точки статичны, движется только глаз (через gluLookAt()). Данные генерируются один раз перед любым рендерингом и сохраняются в двух массивах для использования в цикле рендеринга.
Для прямого рендеринга весь набор данных визуализируется в одном блоке glBegin()/glEnd() с циклом, содержащим по одному вызову glColor3fv() и glVertex3fv().
Для рендеринга массива вершин и VBO весь набор данных визуализируется одним вызовом glDrawArrays().
Затем я просто запускаю его на минуту или около того в узком цикле и измеряю средний FPS с помощью высокопроизводительного таймера.
Результаты производительности ##
Как упоминалось выше, производительность была одинаковой как на моем настольном компьютере (XP x64, 8 ГБ ОЗУ, 512 МБ Quadro 1700), так и на моем ноутбуке (XP32, 4 ГБ ОЗУ, 256 МБ Quadro NVS 110). Однако он масштабировался, как и ожидалось, с количеством баллов. Очевидно, я также отключил vsync.
Конкретные результаты запуска ноутбука (рендеринг с GL_POINTS):
glBegin()/glEnd():
- 1К очков --> 603 FPS
- 10 000 баллов --> 401 кадр/с
- 100 000 баллов --> 97 кадров в секунду
- 1 млн баллов --> 14 кадров в секунду
Массивы вершин (сторона процессора):
- 1К очков --> 603 FPS
- 10 000 баллов --> 402 кадр/с
- 100 000 баллов --> 97 кадров в секунду
- 1 млн баллов --> 14 кадров в секунду
Объекты буфера вершин (сторона графического процессора):
- 1К очков --> 604 FPS
- 10 000 баллов --> 399 кадров в секунду
- 100 000 баллов --> 95 кадров в секунду
- 1 млн баллов --> 14 кадров в секунду
Я визуализировал те же данные с помощью GL_TRIANGLE_STRIP и получил такие же неразличимые (хотя и медленнее, чем ожидалось, из-за дополнительной растеризации). Я тоже могу выложить эти номера, если кому надо. .
Вопросы)
- Что дает?
- Что мне нужно сделать, чтобы реализовать обещанный прирост производительности VBO?
- Что мне не хватает?