Фризы компиляции шейдеров: почему первые минуты самые тяжёлые

Почему игра рвётся на всём, что показывает тебе впервые, почему обновление драйвера возвращает всё это обратно и почему удаление кэша шейдеров — то самое «решение», которое гарантирует, что ты заплатишь за него ещё раз.

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

Ты запускаешь игру, в которую давно не играл, и первые десять минут ужасны. Каждое новое оружие, каждый новый эффект, первое появление конкретного противника — рывок. Потом всё устаканивается, и ко второму вечеру игра идёт плавно. Это сделало не то, что ты поменял. Это сделало время.

Или другая версия: с игрой всё было в порядке, ты обновил драйвер видеокарты — и весь первый час снова рваный.

И то и другое — один и тот же механизм, и это одна из немногих причин фризов, которая по-настоящему нормальна: её выдаёт здоровая машина с исправным софтом.

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

Шейдер — это маленькая программа, которая выполняется на видеокарте. Разработчик игры пишет её на высокоуровневом языке и компилирует, но лишь наполовину — до промежуточной формы, которая описывает, что программа делает, а не то, как это должен делать конкретный графический чип.

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

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

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

Что отбрасывает тебя в начало

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

Ничто из этого не является неисправностью. Это цена того, что кэш остаётся верным, а не устаревшим.

Как понять, что это рывки из-за компиляции шейдеров?

У компиляции шейдеров узнаваемый почерк, и ни на что другое из списка причин фризов она не похожа:

  1. Оно сходит на нет. Это определяющий признак. Если на третьем часу фризит так же, как на третьей минуте, — это не оно.
  2. Оно привязано к новизне. Первый вид оружия, области, погодного эффекта, конкретного противника. Второй проход по тому же коридору чистый.
  3. Оно не зависит ни от температуры, ни от длительности сессии. Проблемы с нагревом становятся хуже, чем дольше ты играешь; это — лучше.
  4. Оно возвращается по расписанию, которое ты можешь назвать — после обновления драйвера, после патча, после очистки, — а не случайно.
  5. Занята не видеокарта. Компиляция — работа процессора. Видеокарта, сидящая заметно ниже полной загрузки во время этих рывков, здесь ожидаема и не является свидетельством отдельной проблемы, описанной в Внезапные просадки FPS в играх.

Если эти пять пунктов твой симптом не описывают, вернись к общему списку в Почему игры фризят на Windows 11: тамошние причины сами по себе не сходят на нет.

Что с этим делать

В основном — дать этому случиться. Но по краям есть и настоящий выбор.

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

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

После обновления драйвера оставь машину включённой на какое-то время. Некоторые драйверы пересобирают шейдеры DirectX 12, пока система простаивает, — как раз чтобы потом среда исполнения делала это меньше. Помогает это только в том случае, если машине достаётся время простоя.

Держи игру и её кэш на SSD и вне синхронизируемой папки. Облачный клиент следит за каждой записью, а игра пишет свой кэш шейдеров постоянно — каждая запись превращается в работу драйвера-фильтра плюс отправку по тому же соединению, которым пользуется твой матч.

Не измеряй внутри этого окна. Запись, снятая в первые минуты после обновления драйвера, измеряет компилятор, а не драйвер. Как читать результаты бенчмарка разбирает правила сравнения; так легко случайно нарушить первое из них.

Что об этом говорит сканер

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

Это намеренно подаётся не как неисправность, которую надо чинить. Чинить нечего — есть цена, которую платят один раз, и самое честное, что может сделать инструмент, — сказать тебе, что ты сейчас внутри неё, чтобы ты не потратил вечер на обвинение какой-нибудь настройки.

Что, если рывки так и не сходят на нет?

Фризы компиляции, которые никогда не сходят на нет, — уже другая проблема: кэш не сохраняется. Проверь, что диск не заполнен, что кэш не стирает запланированная очистка между сессиями и что папка игры не лежит там, где её постоянно чистит облачный клиент или предел размера.

А если прогон неровный на всём протяжении, а не только в начале, то смотреть надо Высокий средний FPS, но плохие 1% low: это проблема события, а не прогрева.

Похожие статьи

Автор — w0a, проект, который разрабатывает приложение. Статья публикуется только после того, как пройдут автоматические проверки сайта, а дата вверху — это день, когда её текст менялся в последний раз.

Играешь в CS2? Какие параметры запуска ещё что-то делают и где в меню видео на самом деле лежат кадры: Как повысить FPS в CS2 и откуда берутся микрофризы: чек-лист по замерам

3 дня Pro — активируются прямо в приложении через Discord, без карты: Как работает бесплатный триал

w0a не меняет ни одной настройки Windows, пока ты не попросишь, а твик сохраняет старое значение, прежде чем записать новое. Сообщить мне

Эта страница помогла?

Чего не хватило или что не сработало? Мы читаем каждый такой ответ.

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

Если эта страница не решила проблему, напиши нам — скажи, какую статью ты читал, и мы её исправим.