После многих лет слушаний об объектах Vertex Buffer (VBO) я наконец решил поэкспериментировать с ними (мои вещи обычно не критичны по производительности, очевидно ...)
Я опишу свой эксперимент ниже, но, короче говоря, я вижу неразличимую производительность между «простым» прямым режимом (glBegin () / glEnd ()), массивом вершин (сторона ЦП) и VBO ( GPU сторона) режимы рендеринга. Я пытаюсь понять, почему это так, и при каких условиях я могу ожидать, что 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 (): * * тысяча двадцать-один
- 1K pts -> 603 FPS
- 10K pts -> 401 FPS
- 100K pts -> 97 FPS
- 1M pts -> 14 FPS
Вершинные массивы (на стороне процессора):
- 1K pts -> 603 FPS
- 10K pts -> 402 FPS
- 100K pts -> 97 FPS
- 1M pts -> 14 FPS
Объекты буфера вершин (сторона GPU):
- 1K pts -> 604 FPS
- 10K pts -> 399 FPS
- 100K pts -> 95 FPS
- 1M pts -> 14 FPS
Я рендерил те же данные с GL_TRIANGLE_STRIP и получил аналогично неразличимые (хотя и медленнее, чем ожидалось из-за дополнительной растеризации). Я могу опубликовать эти цифры тоже, если кто-то хочет их.
.
Вопрос (ы)
- Что дает?
- Что мне нужно сделать, чтобы реализовать обещанный прирост производительности VBO?
- Что мне не хватает?