
Представьте ситуацию: вы запускаете игру, которую скачивали несколько часов, в надежде сразу же погрузиться в приключение, но тут вас встречает надоедливая табличка с надписью: «Идет компиляция шейдеров». Знакомо? Практически все игры последних лет с продвинутой графикой невозможно запустить без компиляции шейдеров. Но какую роль играют шейдеры и зачем они компилируются? Разберем по полочкам эту сложную тему.
Содержание
Что такое шейдеры
В компьютерной графике используется полигональная (фасетная) модель построения объектов. То есть любой объект, который вы видите в играх (персонаж, здания, мчащийся по дороге автомобиль и сама эта дорога), состоит из простейших геометрических фигур — треугольников, а иногда четырехугольников и пятиугольников. У каждого полигона (фигуры) есть вершина с координатой. Используя эти данные, вычислительная машина соединяет вершины фигур, создавая полигональную сетку, из которой строится «скелет» 3D-модели.

Если модели в играх состоят, например, из треугольников, то почему они не выглядят угловатыми? Ответ прост: постройте модель из тысяч полигонов — и тогда края объекта сгладятся настолько, что человеческому глазу сложно будет заметить неровность. То есть получится модель с высокой детализацией.

Окей, а как это связано с шейдерами? Шейдеры — это небольшие компьютерные программы, написанные на языке программирования высокого уровня и исполняемые на специальных ядрах графических процессоров (видеокарт). Шейдеры используются в графических API — DirectX, Vulkan OpenGL — и помогают разработчикам быстрее создавать объекты и сложные визуальные эффекты для них. Одна из функций шейдера — это задание координат вершин полигонов для построения полигональных моделей.
Зачем нужны шейдеры?
На ранних этапах развития технологий разработки игр шейдеры использовались для визуального оформления теней объектов. Отсюда и пошло название (от англ. Shade — тень, затенение). В дальнейшем инженеры поняли, что в такие мини-программы удобно «упаковывать» и другие куски кода. За счет того, что шейдеры запускаются на заточенных под это дело ядрах графических процессоров, скорость исполнения кода существенно выросла, вместе с чем подтянулась общая производительность систем в играх.
Разработчики получили возможность усложнять графику, делать ее более комплексной, а также добавлять больше визуальных эффектов, доходя вплоть до кинематографического качества картинки, чем может похвастаться, например, The Last of Us II или God of War Ragnarok. Обратная сторона реалистичной графики — это высокие требования к производительности графического процессора. Чтобы поиграть в Full HD с комфортом, понадобится минимум RTX 4060, а входной уровень для Quad HD — это RTX 4070.
Типы шейдеров
Раз уж был придуман такой удобный инструмент для блочного хранения и исполнения кода, как шейдеры, неудивительно, что его начали применять все чаще. Сейчас в средах разработки игр повсеместно применяются четыре главных типа шейдеров.
- Вершинные (Vertex Shaders)Ключевые шейдеры, которые обрабатывают вершины координат полигонов. Создают «карту» 3D-объектов на экране.

- Фрагментные (Pixel Shaders)«Цветовые» (пиксельные) шейдеры отвечают за то, как будет выглядеть сцена. То есть они «раскрашивают» пиксели, из которых состоят объекты, накладывая текстуры, а также создают эффекты освещения, тени и отвечают за отражение и преломление света.

- Геометрические (Geometry Shaders)Шейдеры, которые могут принимать на вход геометрические примитивы и создавать в режиме реального времени дополнительные данные, повышая детализацию модели.

- Вычислительные (Compute Shaders)Вспомогательные шейдеры, которые не взаимодействуют с графическими объектами напрямую, а в основном выполняют математические операции на больших объемах данных. У вычислительных шейдеров разнородные функции: от процедурной генерации объектов и физической симуляции (частицы, ткани, жидкости) до работы с системами искусственного интеллекта.
Естественно, это не единственные типы шейдеров. В зависимости от требований разработчиков создаются и какие-то кастомные шейдеры. Например, в играх, использующих технологии видеокарт NVIDIA, могут использоваться Ray Tracing Shaders (шейдеры трассировки лучей), которые работают со светом и отражениями. А профессиональные приложения для работы с ИИ могут использовать Tensor Shaders — шейдеры, которые эффективнее всего исполняются на тензорных ядрах видеокарт NVIDIA.




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

Бывалые игроки вспомнят, что еще лет 10 назад при запуске игр не появлялись никакие таблички с просьбой подождать, пока завершится процесс компиляции. Так почему сейчас это происходит почти в каждой игре AAA-уровня? Ответ прост: их стало существенно больше. Раньше разработчики умело «прятали» компиляцию под вступительные катсцены или экраны загрузок — этого времени хватало, чтобы подгрузились необходимые текстуры и скомпилировались шейдеры. А остальное происходило по мере игрового процесса без существенного влияния на производительность.
Сейчас огромный пак шейдеров может компилироваться десятки минут. Естественно, это не перекрыть катсценой или загрузочным экраном. Поэтому разработчики говорят в лоб: «Ждите, пока скомпилируются шейдеры».
Ошибки компиляции
А что будет, если принудительно прервать компиляцию шейдеров в играх? В лучшем случае — ничего, они просто начнут компилироваться заново. А в худшем случае появятся ошибки в коде, которые приведут к визуальным искажениям, вылетам, зависаниям. Например, экстренное прерывание может нарушить связи между шейдерами, что приведет к вылету игры при обращении к этому фрагменту кода. Решить проблему можно полной переустановкой игры.
Реже случаются ошибки компиляции из-за несовместимого оборудования — когда у графического процессора отсутствуют нужные ядра для исполнения специализированного шейдера. Иногда проблема носит программный характер — попросту устарели драйверы или графический API.
Не совсем ошибка, но распространенная проблема — низкая производительность. Когда у игры слишком много сложных шейдеров, а графическому процессору не достает производительности, возникают зависания, лаги, «слайд-шоу» на экране. Эта проблема связана с устареванием железа и лечится только апгрейдом. Например, древнюю GTX 1050 Ti, которая в свое время считалась мейнстримной игровой картой, неплохо бы уже заменить на RTX 4060 или хотя бы RTX 3050.
Держи подарок от именинника: праздничные скидки от 32% в «Эльдорадо»
Узнать большеКак ускорить компиляцию?
На самом деле способов ускорить компиляцию не так много. Самый действенный из них — это установка игры на SSD-накопитель. Даже самый обычный накопитель стандарта PCIe 3.0 ускорит компиляцию в разы в сравнении с традиционным жестким диском (HDD).
Если при запуске игры компиляция каждый раз проходит повторно (например, такое встречается в Apex Legends или Marvel Rivals), включите кэширование в настройках графического процессора.
NVIDIA
- Запустите панель управления NVIDIA, кликнув правой кнопкой мыши по свободному месту на рабочем столе и нажав на соответствующий ярлык.

- Перейдите во вкладку «Управление параметрами 3D».

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

- Примените настройки, нажав на соответствующую кнопку в нижней части окна.
AMD
Внимание: редактирование реестра сопряжено с рисками. Рекомендуется сделать бэкап важных данных и создать точку восстановления!
- Нажмите сочетание клавиш Win + R и в появившемся окне введите команду regedit.

- В дереве папок перейдите по пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\UMD.
- Найдите файл с названием ShaderCache.
- Если файла нет, создайте его, кликнув правой кнопкой мыши на свободное место и выбрав в выпадающем меню «Создать двоичный параметр». Обязательно назовите файл ShaderCache.

- Два раза кликните по файлу.
- В открывшемся окне введите один из трех параметров:
- 30 00 — кэширование шейдеров выключено;
- 31 00 — оптимизировано драйвером AMD;
- 32 00 — кэширование шейдеров всегда включено.

- Перезагрузите компьютер после всех изменений.
2SDnjcEhkzY