Я работаю над методом автоматической пакетной обработки OpenGL в моем игровом движке, чтобы уменьшить количество вызовов отрисовки и избыточных вызовов.
Мой пакетный дизайн дерева начинается с самых дорогих состояний и добавляет листы вниз для каждого менее дорогого состояния.
Пример: Корень дерева: Шейдеры / Программы Братья и сестры: Состояния смешивания ... a.s.o.
Итак, мой вопрос: какие звонки в этом списке, скорее всего, являются самыми дорогими:
- программа привязки
- текстуры переплета
- буферы привязки
- текстура буферизации, данные вершин
- привязка целей рендеринга
- glEnable / glDisable
- уравнение состояния наложения, цвет, функции, colorWriteMask
- глубина состояния трафарета depthFunc, stencilOperations, stencilFunction, writeMasks
Также интересно, какой метод будет быстрее:
- Соберите все команды рисования с возможностью пакетной обработки в буфер с одной вершиной и вызовите только 1 вызов отрисовки (этот метод также заставит обновлять преобразования матрицы для каждой вершины на стороне процессора)
- Не выполнять пакетную обработку вообще и рендерить много мелких вызовов отрисовки, только пакетную систему частиц ...
PS: Цели рендеринга всегда будут меняться до или после, в зависимости от использования.
Прогресс на данный момент:
- Андон М. Коулман: Самая дешевая привязка однородных массивов и вершинных массивов, дорогие FBO, привязки текстур
- datenwolf: программы делают недействительным государственный кеш
1: Состояния фреймбуфера
2: Программа
3: Связывание текстуры
...
N: Связывание массива вершин, Равномерное связывание
Текущее дерево выполнения в WebGL:
- Программа
- Указатели атрибутов
- Текстура
- Состояние смешивания
- Состояние глубины
- Состояние трафарета спереди / сзади
- Состояние растеризатора
- Состояние сэмплера
- Привязать буфер
- Рисовать массивы
Каждый шаг представляет собой одноуровневое хеш-дерево, чтобы избежать проверки кеша состояния снова внутри основной очереди рендеринга.
Загрузка текстур / программ / шейдеров / буферов происходит перед рендерингом в дополнительной очереди, для будущей многопоточности, а также для того, чтобы убедиться, что контекст инициализирован, прежде чем что-либо с ним делать.
Самая большая проблема самостоятельной рендеринга объектов заключается в том, что вы не можете контролировать, когда что-то происходит, например, если разработчик вызывает эти методы до инициализации gl, он не будет знать почему, но у него будут некоторые ошибки или проблемы ...
glBindXXX (...)
, а с тем, что происходит, когда вы выполняете вызов отрисовки после изменения 20 нечетных состояний, и все они должны быть проверены сразу. - person Andon M. Coleman   schedule 26.08.2014