Если сказать любому поклоннику игр на ПК сочетание Unreal Engine, есть высокая вероятность, что он подумает о качественной графике, которую можно увидеть в таких играх, как Black Myth: Wukong, Senua’s Saga: Hellblade II и A Plague Tale: Requiem. Однако есть еще кое-что, что часто связывают с Unreal Engine — это фризы или “статтеринг”. Если вы задаетесь вопросом, почему они происходят, разработчики UE подробно объяснили причину и рассказали, как они с этим разбираются.
Начнем с основ. Шейдеры — это небольшие блоки кода, используемые для рендеринга графики, выполняющие конкретные задачи. Это может быть перемещение треугольника по экрану или вычисление цвета пикселя с учетом источников света, материалов и эффектов.
Unreal Engine предоставляет возможности разработки игр с использованием C++ или визуальных блоков кода под названием Blueprints. Чтобы упростить создание графики, используются API вроде Direct3D или Vulkan, преобразующие простую команду в набор более сложных инструкций для графического процессора.
Однако GPU не понимает команды напрямую, поэтому драйверам приходится компилировать шейдеры в понятный для видеокарты формат. В современных 3D-играх таких шейдеров могут быть десятки тысяч, и если их компиляция происходит во время игры, процессор может кратковременно перегружаться, вызывая резкое падение FPS — именно это и называют статтерингом.
Epic объясняет механизм этой проблемы:
Для рендеринга объекта требуется несколько шейдеров (например, вершинный и пиксельный шейдер), а также настройки GPU — режим отсечения, смешивания и другие параметры. Иногда драйвер начинает компилировать шейдеры только при обработке команды рисования, что может занимать десятки миллисекунд и приводить к долгим кадрам.
Чтобы уменьшить фризы, в Unreal Engine до версии 5.2 рекомендовали собирать ключевые PSO (Pipeline State Objects) в кэш при запуске игры или загрузке уровня. Однако это требовало значительных ресурсов и не подходило для игр с динамическим контентом.
Решение проблемы
Epic внедрила систему предварительного кэширования PSO в новых версиях UE.
Когда объект загружается, система анализирует его материалы и вычисляет подмножество возможных PSO, которые могут быть использованы для его рендеринга. Это подмножество меньше полного набора, что позволяет компилировать их во время загрузки игры. Например, в Fortnite компилируется около 30 000 PSO на матч, из которых используется около 10 000.
Но Epic признает, что эта система пока не идеальна. Глобальные шейдеры, используемые для постобработки (например, размытие в движении), пока не могут полностью кэшироваться, что иногда вызывает единичные фризы.
Epic также работает над сокращением объема PSO-кэша в памяти и оптимизацией его хранения. Разработчикам советуют использовать последние версии UE, регулярно профилировать PSO и избегать перехода на DirectX 11, так как он менее эффективен в борьбе с фризами.
Хотя Epic признает проблему с опозданием, решение все же существует. Возможно, в будущем крупные релизы смогут выходить без раздражающих статтеров, и провалы в играх, вроде Star Wars Jedi: Survivor останутся в прошлом.