Действительно, изменения состояния могут быть причиной снижения производительности.Однако важный вопрос, который нужно задать: «Какое государство».Некоторые изменения состояния настолько дешевы, что просто не имеет смысла отслеживать их, чтобы свести к минимуму их использование.
В современных реализациях OpenGL glEnable
/ glDisable
практически не имеют снижения производительности (конечнонекоторые включенные / отключенные состояния имеют большое влияние на производительность рендеринга в целом.)
Итак, что такое дорогостоящие изменения состояний?Обо всем, что убивает содержимое кеша, и данные в кеше должны быть доступны с высокой пропускной способностью или требуют высокой пропускной способности.
Текстуры являются наиболее дорогим источником данных для переключения.Так что в качестве основного правила вы сортируете свою сцену с помощью текстур, чтобы переключать текстуры как можно меньше.
Еще одно дорогое изменение состояния - это переключение шейдеров.Переключение шейдера негативно влияет на графический процессор двумя способами: во-первых, он заставляет процессоры полностью останавливаться, сбрасывая конвейер их выполнения.Заправка трубопровода до тех пор, пока все работает "как по маслу", занимает несколько сотен циклов.Другая проблема заключается в том, что разные шейдеры имеют разные схемы исполнения и доступа к данным.Шаблоны выполнения определяются единицами предсказания кодового пути, чтобы оценить, какие операции должны быть выполнены наиболее вероятно.Это также означает, что нужно знать, какие данные предварительно выбрать.Переключение шейдера уничтожает эту важную информацию.
Состояния, которые очень дешевы, но не бесплатны, это то, что можно описать небольшим набором чисел: Униформа.Переключение униформ является чрезвычайно дешевым, так как оно требует очень незначительных накладных расходов при связи с графическим процессором, и поскольку униформы живут в регистрах, их изменение не повлияет ни на кеш-линии, ни на прогнозирование выполнения.И если вас интересует традиционная фиксированная функция OpenGL: матрицы преобразования, параметры освещения, плоскости отсечения являются униформой (просто посмотрите на спецификацию OpenGL-2.1 GLSL, в которой есть встроенные униформы).