Зачем компили­ровать шейдеры при каждом заходе в игру?

12
Аватар автора

Орлетос

спросил в Сообществе

Купил «Сталкер-2», играю в него на мощном железе: 4080 Super, i7-12700KF, 64 Гб ОЗУ.

И даже с такой конфигурацией игра при каждом включении полминуты подгружает шейдеры. Это проблема оптимизации или сборки моего ПК? Можно ли ее решить и загрузить эти несчастные шейдеры раз и навсегда?

Ненавистный экран
Ненавистный экран
Аватар автора

Антон Копылов

дождался компиляции шейдеров

Страница автора
Аватар автора

Стас Зверянов

пересчитал каждый фотон света в кадре

Страница автора

Раз и навсегда шейдеры загрузить не получится: они будут заново компилироваться при установке патчей или обновлении драйверов. Но можно попробовать сократить этот процесс.

На хардверном уровне можно перенести игру с жесткого диска на SSD. На софтверном — обновить драйверы видеокарты, изменить размер кэша драйверов, обновить игру и установить соответствующий мод.

Что такое шейдеры и зачем они нужны в играх

Зачем шейдеры компилируют и почему это занимает столько времени

Компиляция шейдеров нужна для перевода информации с языка игры на язык видеокарты. Внутри игры всегда несколько версий шейдеров. Например, карты с RTX получают один вариант отображения света, а без него — другой. Разработчики вставляют в билд игры оба варианта, но на конкретном ПК использоваться будет один.

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

Не вдаваясь в подробности 3D-моделирования, процесс компиляции шейдеров выглядит так:

  1. Предварительная обработка. Подготовительный этап, на котором данные готовятся к обработке.
  2. Синтаксический анализ. Код шейдера проверяется на ошибки, система ищет замену поврежденным файлам в образе игры, если возникают проблемы.
  3. Оптимизация. Из кода удаляются дублирующиеся операции, неиспользуемые переменные и другие компоненты, которые замедляют его работу. Это нужно, чтобы видеокарте, которая будет отрисовывать графику, было проще работать.
  4. Генерация машинного кода. Облеченный код преобразуется в машинный, который понимает видеокарта.
А вот ответ конкретно на ваш вопрос: за полминуты компиляцию можно отключить вовсе

Как ускорить компиляцию шейдеров

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

  1. Перенесите игру на SSD.
  2. Обновите драйверы видеокарты. Иногда производители GPU выпускают драйверы для определенных игр. Например, Nvidia делала так для Stalker 2 и Flight Simulator.
  3. Измените размер кэша шейдеров. Для видеокарт NVIDIA эта настройка располагается в 3D → «Размер кэша шейдеров» → «Без ограничений».
  4. Скачайте мод. Например, у Stalker 2 есть специальный No Shader Warmup.
  5. Обновите игру.
Будьте бдительны: неограниченный размер кэша рано или поздно займет весь накопитель
Будьте бдительны: неограниченный размер кэша рано или поздно займет весь накопитель

Почему компиляция шейдеров зависит от игры

Разработчики игр используют разные движки, которые содержат свои алгоритмы работы с шейдерами.

Например, в Unity компиляция происходит в процессе использования. Это ускоряет загрузку, но, если шейдеров много или они зависимы друг от друга, время и нагрузка на комплектующие увеличиваются.

В Unreal Engine шейдеры также компилируются по требованию, но алгоритм отличается: движок позволяет сохранить и заранее скомпилировать материалы — информацию об отображении поверхности, использованных текстурах, цветах и оттенках, — а также сохранить обработанные шейдеры в быструю кэш-память.

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

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

Видео на 10 минут для тех, кому лень было читать материал

Пять современных игр, которые не требуют компиляции при каждом запуске

Kingdom Come: Deliverance 2

Чешская RPG от Warhorse Studios работает на движке CryEngine и выделяется отличной оптимизацией. При этом в игре большой открытый мир, множество геймплейных механик, завязанных на поведении NPC, и великолепная графика

Forza Horizon 5

Главная аркадная гонка современности. В Мексике проходит масштабный автомобильный фестиваль Horizon, а действие разворачивается в огромном открытом мире со множеством испытаний и секретов. Игра работает на кастомном движке Playground Studios, а загрузки здесь чуть ли не мгновенные

Star Wars: Jedi Survivor

На релизе экшен по «Звездным войнам» критиковали за не самую лучшую оптимизацию, но сейчас игра хорошо идет даже на Steam Deck. Unreal Engine 4 обеспечивает плавную частоту кадров при отличной картинке, а шейдеры загружаются всего один раз

Ratchet & Clank: Rift Apart

В ярком экшен-платформере от Insomniac используют мгновенные загрузки для телепортации между уровнями. Визуально игра не уступает последним мультфильмам Pixar и выделяется отличной оптимизацией

Indiana Jones and the Great Circle

В недавней игре про Индиану Джонса используют новейшую версию idTech Engine, на котором работают последние части Doom. Благодаря этому она запускается в стабильных 60 FPS даже на относительно слабой Xbox Series S и не требует компиляции шейдеров на среднебюджетных ПК

Что в итоге

Самый простой вариант ускорить компиляцию шейдеров — обновить жесткий диск и перенести игру на SSD. Во вторую очередь обновите драйверы видеокарты и установите последние патчи от разработчиков. В конкретных играх поможет установка модов.

Антон КопыловРасскажите, чем занимаетесь, пока приходится ждать компиляции шейдеров:
  • беспонтовый пирожокПорадовала скорость компиляции шейдеров во второй части Одних из нас, особенно в сравнении с первой частью на пк.0
  • Паша ГессКак мы раньше жили без компиляции шейдеров?1
  • ldk300Спасибо, конечно, но ответа на вопрос в заголовке так и нет. Зачем компилировать эти несчастные шейдеры при КАЖДОМ запуске игры, даже когда не было изменения настроек, состава оборудования и обновления игры?3
  • Дмитрий Соколовldk300, я отвечу даже не конкретно про шейдеры, а про любой подобный кэш. Проверка его валидности возможна далеко не всегда, а последствия некорректной проверки будут хуже, чем гарантированная пересборка в свежее состояние. Вот и применяется максимально простое и работающее решение. Игры нацелены на развлечение людей, которые только кнопки WASD из всего компьютера знают, их крайне плохо заставлять ещё и за шейдерами следить. А тезис «бери комп помощнее» у них вопросов не вызовет.0
  • ОлегДмитрий, они же компилируются под конкретные условия использования? Ну так можно сохранить параметры компиляции и при запуске сравнивать текущие условия с сохраненными. Если ничего не изменилось, то брать уже скомпилированное.0
  • Дмитрий СоколовОлег, ещё раз: сравнивать условия можно, но не так уж просто. Много внешних факторов. А пользователь по определению не является профессионалом, он вообще развлекаться пришёл. В таких случаях просится плохое, но понятное решение: обновлять всё каждый раз. Проект делался в спешке, из всех его багов и недоделок надо исключить хотя бы сценарии «кэш обновился неверно» (за неимением по факту такового).0
  • ОлегДмитрий, при чем тут пользователь? Игра при запуске определяет условия и компилирует шейдеры. Вот пусть эти условия, с которыми компилирует, и сохраняет рядышком. А при следующем запуске опять определяет условия и смотрит, не изменились ли они по сравнению с сохраненными. Если нет, а в 99% случаев они не изменились, то чего опять бесполезную работу делать? В статье написано, что компилируется под конкретную конфигурацию компьютера. Насколько часто она обновляется? Ну уж никак не при каждом запуске.0
  • Дмитрий СоколовОлег, бесполезно объяснять, я понял. Первым же словом упомянул, что задача с конфигурацией как раз не самая простая, и вот мы снова про неё.0
  • ОлегДмитрий, то есть вы сами ничего не понимаете, так что ли? Игра может скомпилировать шейдеры с учетом конфигурации и внешних факторов? Значит она может эту конфигурацию и эти факторы определить. По крайней мере настолько, чтобы эти шейдеры были работоспособны. Какая разница просто это или нет, если эта задача выполняется. Ладно, приведите пример хотя бы одного из этих жутко трудно определимых внешних факторов, который изменится при запуске игры через час.0
  • Дмитрий СоколовОлег, нет, не может. Компилятор шейдеров — внешний инструмент, игра за него не отвечает.0
  • ОлегДмитрий, хорошо, внешний инструмент может скомпилировать шейдеры с учетом конфигурации и внешних факторов? Значит он может эту конфигурацию и эти факторы определить. По крайней мере настолько, чтобы эти шейдеры были работоспособны. И сохранить сведения об этой конфигурации и условиях, чтобы в следующий раз сравнить и не перекомпилировать бесполезно. Ну и все же, приведите пример хотя бы одного из этих жутко трудно определимых внешних факторов, который изменится при запуске игры через час.0