Как работает графика в PUBG. Рендеринг кадра игры. Ищем косяки.

Разбираемся с процессом построения кадра графическим движком PUBG (Unreal Engine)
Ищем причины подтормаживаний игры на любой системе. Текст + Видео

Привет. Этим постом хочу поделиться с вами процессом отрисовки кадров в PUBG.
С помощью специального софта (Nvidia Nsight + Visual Studio 2017 + RenderDoc) изучаем как PUBG выводит картинку на экран. Каждый кадр игры. Вместе с этим я нашел неоптимизированные участки в игре, которые следовало бы зачинить, что бы геймплей стал приятнее.

Погнали!


Давайте посмотрим на этот кадр. Какие этапы выполняются для получения такой картинки.

Первым делом движок выполняет симуляцию частичек, но на данном кадре нет ни взрывов ни искр, поэтому данный этап пропускается.

Следующим делом игра рендерит статические объекты в глубинный буффер. Этому буфферу есть применение на многих стадиях подготовки кадра. Одна из самых важных - отсечение лишней геометрии. Т.е. тех объектов которых мы не видим. Например мебель в домах мы не видим, т.к. она скрыта стенами дома. Значит движку незачем ее отрисовывать и затрачивать ресурсы системы.

Отсечение лишней геометрии процесс важный, но тоже требует ресурсов и времени системы. Для его оптимизации движком предусмотрено переиспользование данных о перекрытиях из предыдущих кадров. Но эти данные устаревают когда мы перемещаемся и крутим камерой. В такие моменты движку приходится все пересчитывать заново, плюс множество объектов все же не откидывается. Значит движку приходится их рендерить.

Вот такие пики на графиках означают такие моменты. В эти моменты возникает сильная нагрузка на систему. В эти моменты мы чувствуем подлагивания, фризы или просто необъяснимый дискомфорт. Все зависит от мощности ПК.

Вот к примеру столик, который отрисовался далеко далеко от нас. В карьере.

Там рендерится много объектов, которые находятся очень далеко, так еще их и вовсе не видно, они закрыты другими объектами. Однако движок игры тратит на них ресурсы и время. Движок не должен это рендерить, это просто работа впустую.

Очевидно, что стандартная система отсечения лишней геометрии не подходит и нужно либо брать другую (umbra, insta lod) или переделывать самостоятельно.

Идя дальше по процессу построения кадра...

Движок рендерит объекты оборачивая их в текстуры. Отрисовываются объекты сразу в несколько буфферов: GBufferC дифьюз , GBufferA - нормали, SceneColorDeferred - непрямого освещения, Distortion -отражаемости, матовости и тд.

Потом рендерятся: HBAO+

Каскады теней

И прозрачные объекты.

Далее постобработка и финальный кадр готов.