После многих лет слуха о Vertex Buffer Objects (VBOs) я, наконец, решил экспериментировать с ними (мои вещи обычно не критичны по производительности, очевидно...)
Я опишу свой эксперимент ниже, но, чтобы сделать длинную историю коротким, я вижу непревзойденную производительность между "простым" прямым режимом (glBegin()/glEnd()), массивом вершин (сторона процессора) и VBO ( GPU). Я пытаюсь понять, почему это так, и при каких условиях я могу ожидать, что VBOs значительно затмевают своих примитивных (каламбур) предков.
Детали эксперимента
Для эксперимента я создал (статическое) трехмерное гауссовское облако большого числа точек. Каждая точка имеет связанную с ней информацию о вершине и цвете. Затем я вращал камеру вокруг облака в последовательных кадрах в виде "орбитального" поведения. Опять же, точки статичны, только глаз движется (через gluLookAt()). Данные генерируются один раз перед любым рендерингом и сохраняются в двух массивах для использования в цикле рендеринга.
Для прямого рендеринга весь набор данных отображается в одном блоке glBegin()/glEnd() с циклом, содержащим один вызов, каждый из которых - glColor3fv() и glVertex3fv().
Для вершинного массива и рендеринга VBO весь набор данных отображается с помощью одного вызова glDrawArrays().
Затем я просто запускаю его на минуту или около того в узкой петле и измеряю среднее значение FPS с помощью высокопроизводительного таймера.
Результаты работы ##
Как упоминалось выше, производительность была неотличима как на моем настольном компьютере (XP x64, 8GB RAM, 512 MB Quadro 1700), так и на моем ноутбуке (XP32, 4GB RAM, 256 MB Quadro NVS 110). Тем не менее, он имел масштаб, как и ожидалось, с количеством очков. Очевидно, я также отключил vsync.
Конкретные результаты запуска ноутбуков (рендеринг w/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 и получил аналогичную неразличимость (хотя и медленнее, чем ожидалось, из-за дополнительной растеризации). Я тоже могу отправить эти цифры, если кто-то их захочет. .
Вопрос (ы)
- Что дает?
- Что мне нужно сделать, чтобы реализовать обещанное повышение производительности VBOs?
- Что мне не хватает?