Оптимизация рендеринга - PullRequest
4 голосов
/ 10 июля 2011

Я слышал, что меньше вызовов при рисовании = быстрее Подразумеваемый урок состоит в том, чтобы упаковать как можно больше данных вершин в как можно меньшее количество массивов, чтобы минимизировать количество вызовов отрисовки.

Я думал о том, чтобы написать среду рендеринга поверх OpenGL, чтобы упаковать все данные вершин в небольшое количество массивов и нарисовать всю сцену всего за несколько вызовов рисования.

Мой вопрос: действительно ли это заканчивается быстрее, если выполнять ALOT рисования за один вызов (например, glDrawElements)?

Я также слышал, что если вы попытаетесь нарисовать слишком большой массив вершин одним вызовом, он переполнит кэш и на самом деле не будет быстрее.

1 Ответ

4 голосов
/ 24 июля 2011

Эта статья будет вам очень полезна: http://www.nvidia.de/docs/IO/8230/BatchBatchBatch.pdf

ИМХО, вам лучше оптимизировать изменения состояния. То есть минимизируйте количество переключений шейдеров или текстур и т. д. Это «реальные» дорогостоящие операции.

Однако по поводу вашего вопроса. Рендеринг количества вершин из большого буфера вершин (по моему опыту) всегда быстрее, чем рендеринг из нескольких меньших.

Я не уверен насчет "переполнения кэша". Насколько я знаю, модуль извлечения вершин извлекает вершины непосредственно из памяти графического процессора (ну, кеш вершин есть, но он хранит только порядка 16 вершин). Единственное переполнение, которое вы можете получить, - это исчерпание VRAM, и в этот момент у вас возникают большие проблемы.

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

...