Godot: оптимизация GLES2 рендера — 2D батчинг

В то время как Juan (reduz) усердно работал над Vulkan, остальная часть команды по рендерингу не сидела без дела. Они работали над исправлениями ошибок и улучшениями рендеринга OpenGL в ветке 3.x. Одной из наиболее ожидаемых 2D-функций является батчинг дроколлов. Это то, на что lawnjelly и Clay (clayjohn) потратили несколько недель для исследования и разработки разумной реализации, которая должна значительно повысить производительность 2D игр.

Вскоре они перенесут свои наработки в ветку 4.0, но пока, по крайней мере, некоторые из улучшений будут доступны только в 3.2.x.

Godot: оптимизация GLES2 рендера — 2D батчинг

Как это работает?

До сих пор 2D рендерер GLES2 рисовал примитивы (например, прямоугольники) индивидуально. Каждый прямоугольник, многоугольник, линия и т. д. вызывали дроколл OpenGL. Хотя GPU могут справиться с этим, они не работают с максимальной эффективностью, поскольку оптимизированы для обработки большего количества примитивов в каждом вызове.

Чтобы лучше использовать мощность графического процессора, эти примитивы организуются в батчи в начале каждого кадра. Каждый батч сделан настолько большим, насколько это возможно, чтобы можно было уменьшить количество дроколлов и количество изменений состояния между вызовами, что также является дорогостоящим с точки зрения производительности.

После проверки различных подходов разработчики остановились на многопроходном варианте:

  • Первый проход идентифицирует похожие сущности и группирует их в батчи.
  • Во втором проходе каждый батч рисуется одним дроколлом.

Пока что батчинг был реализована только для прямоугольных примитивов (которые включают в себя тайлы, текст, спрайты и многие GUI узлы). Сцены, в которых интенсивно используются многоугольники, меши или другие непрямоугольные примитивы, не получат никакой выгоды от текущей работы, батчинг будет распространён на эти другие типы после тщательного тестирования текущей реализации.

Чтобы наилучшим образом воспользоваться преимуществами батчинга, группируйте похожие узлы вместе в дереве сцены, поскольку батчинг не может распространяться на слои сцены и Z индексы. Аналогично, батчи должны иметь общую текстуру, материал, режим наложения, шейдер и скелет.

Результаты

Как и предполагалось, даже при небольших дополнительных затратах батчинг значительно сократил узкие места отрисовки. Специфичные тесты, ориентированные на дроколлы, показывают значительное улучшение производительности.

В реальных играх, однако, ускорение будет зависеть от того, насколько всё упирается в дроколлы. Игры, рисующие много прямоугольников, особенно с высокой плотностью или несколькими тайлоами, или текстом, вероятно, увидят наибольшее ускорение.

Godot: оптимизация GLES2 рендера — 2D батчинг

Сверху: 10000 спрайтов со случайным положением. Внизу: 8 слоёв, заполненных буквой «А», с двумя перемешанными спрайтами.

Как опробовать новый билд

Rémi (akien-mga) готовит серию тестовых сборок, которые команда пытается протестировать, прежде чем слить это всё в основную ветку 3.2.x.

Все изменения можно посмотреть в этом пул реквесте.

4343
2 комментария

eeee наконец то годотина

2
Ответить

Хз что это, но раз чуваки пишут и оптимизируют, грац, круто.

2
Ответить