Статья

Почему игра фризит при высоком FPS: статтер, время кадра и шейдеры

Почему игра фризит при высоком FPS: статтер, время кадра и шейдеры

Во что поигратьВо что поиграть·3 ч назад·
1
··0·
Если коротко: игра фризит при высоком FPS потому, что счётчик FPS показывает среднее за секунду, а глаз замечает каждый отдельный долгий кадр. Сто тридцать быстрых кадров и один, который считался в десять раз дольше, в сумме дают вполне приличные «131 FPS», но на экране вы видите рывок. Чаще всего такой одиночный долгий кадр рождается не на видеокарте, а на процессоре: игра в этот момент компилирует шейдер, подгружает кусок уровня или ждёт данные из памяти. Поэтому мощная видеокарта от фризов не спасает, а иногда делает их даже заметнее.
Я веду «Во что поиграть», и самая частая жалоба в личке звучит так: «ПК новый, FPS под 150, а игра дёргается». Давайте разберём, откуда физически берётся этот рывок, почему его не видно в цифрах и что из популярных советов действительно работает, а что — шаманство.

Почему FPS нормальный, а игра фризит: среднее врёт

FPS — это кадры в секунду, то есть величина, усреднённая по времени. Но игра не выдаёт кадры равномерным потоком: каждый кадр готовится своё время, и это время называется frametime, время кадра, в миллисекундах. При 60 FPS на кадр в среднем приходится 16,7 мс, при 144 FPS — около 6,9 мс.
Теперь простая арифметика. Допустим, за одну секунду игра выдала 130 кадров по 7 мс (это 910 мс) и один кадр, который считался 90 мс. Итого ровно секунда и 131 кадр. Оверлей честно покажет «131 FPS». А на мониторе с частотой 144 Гц эти 90 мс означают, что картинка простояла неподвижно примерно 13 обновлений экрана подряд. Камера «залипла», потом прыгнула — это и есть фриз, или, как говорят, статтер.
Именно поэтому в обзорах железа рядом со средним FPS пишут 1% low — показатель самых медленных кадров. Его считают немного по-разному (кто-то берёт средний FPS по худшему 1% кадров, кто-то — 99-й процентиль времени кадра), но смысл один: насколько плохи самые плохие моменты. Если средний FPS 140, а 1% low — 40, игра будет ощущаться рваной, хотя «цифра большая». А ещё лучше смотреть не на цифры, а на график времени кадра: ровная линия — плавно, линия с редкими высокими пиками — те самые фризы.
Отсюда первое «ага»: вопрос «почему фризит, если FPS нормальный» поставлен неправильно. FPS нормальный в среднем, а фриз — это один-единственный кадр, который в среднем просто растворяется.

Главный виновник: компиляция шейдеров в DX12 и Vulkan

Шейдер — это маленькая программа для видеокарты: как осветить поверхность, как нарисовать дым, как размыть фон. Разработчик пишет её на промежуточном языке, а превратить её в машинный код для конкретной видеокарты и конкретной версии драйвера можно только на компьютере игрока. Microsoft прямо пишет в блоге DirectX, что шейдеры нужно скомпилировать в формат конкретной видеокарты, прежде чем ими можно пользоваться, а компиляция «на лету» во время игры вызывает статтер.
На консоли этой проблемы почти нет: там одна видеокарта и один драйвер, шейдеры компилируют заранее и кладут на диск. На ПК — тысячи сочетаний GPU и драйверов, заранее под все не соберёшь. В новом посте команда DirectX называет долгую компиляцию шейдеров и статтер в D3D12-играх двумя главными проблемами PC-гейминга и объясняет это именно тем, что у ПК нет фиксированного окружения драйвера и GPU.

Что такое PSO и почему их так много

В DirectX 11 драйвер сам решал, когда и что компилировать, и многое прятал от игры. DirectX 12 и Vulkan устроены «явно»: игра заранее собирает так называемый PSO (pipeline state object) — пакет из шейдеров и настроек конвейера отрисовки. Плюс в том, что движок может создать всё заранее. Минус в том, что если он этого не сделал, PSO будет собираться в момент, когда объект впервые появляется на экране. И кадр ждёт.
Комбинаций огромное количество: материал × тип освещения × качество теней × эффекты. Первый взрыв гранаты, первый вход в дождь, первый новый тип врага — и каждый раз процессор на десятки миллисекунд занят компиляцией. В документации Unreal Engine компиляция PSO по умолчанию считается фризом, если заняла больше 20 мс, а там же сказано, что при пустом кэше драйвера начальная компиляция на процессорах среднего уровня должна укладываться в минуту.
Отсюда второе «ага»: шейдерный статтер почти всегда связан с первым разом. Пробежали локацию второй раз — плавно, потому что скомпилированный результат уже лежит в кэше. Если игра дёргается в одном и том же месте каждый раз, это, скорее всего, уже не шейдеры.
Средний FPS один и тот же, а ощущается по-разному: решает, есть ли в потоке редкие долгие кадры

Почему фризы возвращаются после обновления драйвера

Скомпилированные шейдеры хранятся в кэше драйвера на диске. Но этот кэш привязан к версии драйвера: Microsoft отдельно отмечает, что обновление драйвера делает кэш недействительным. Поставили свежий драйвер — и игра, которая месяц шла гладко, снова «спотыкается» первые полчаса. Это не сломалось железо и не «драйвер кривой»: просто вся работа по компиляции началась заново.
Из этого следует практический вывод, который многие делают наоборот. Чистить кэш шейдеров «для профилактики» — плохая идея: вы сами себе устраиваете повтор первых фризов. Очищать его имеет смысл только когда игра падает или рисует артефакты и есть подозрение на испорченный кэш. А вот оставлять кэшу достаточно места (в панели NVIDIA есть настройка размера кэша шейдеров) и держать игру на SSD, а не на заполненном под завязку диске, — разумно.

Другие источники фризов: стриминг уровня, память и фон

Traversal stutter: игра догружает мир

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

Не хватает видеопамяти или оперативной памяти

Когда текстуры не влезают в видеопамять, драйвер вынужден гонять данные через шину из обычной ОЗУ, а это в разы медленнее. Средний FPS может оставаться высоким, но в моменты, когда нужна «выгруженная» текстура, кадр задерживается. То же с ОЗУ: если её мало, система начинает пользоваться файлом подкачки на диске. Подробнее о том, как отличить нехватку памяти от упора в процессор или видеокарту, мы уже разбирали в материале про узкие места игрового ПК — по ссылке ниже. Здесь важно одно: признак нехватки памяти — фризы при поворотах камеры и смене сцены, которые усиливаются на высоких настройках текстур и исчезают на средних.

Фоновые процессы

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

Миф: «больше FPS — всегда плавнее»

Интуиция говорит: раз кадров больше, значит и движение глаже. Но плавность — это не количество кадров, а их равномерность. Ровные 90 FPS, где каждый кадр приходит через 11 мс, выглядят плавнее, чем «150 FPS», где кадры идут то через 5, то через 12 мс. Глаз видит не среднее, а разницу между соседними кадрами.
Есть и обратный эффект, который как раз объясняет, почему на мощном ПК фризы раздражают сильнее. При 60 FPS лишние 30 мс компиляции — это кадр в 47 мс вместо 17, почти в три раза дольше обычного. При 144 FPS тот же самый шейдер даёт кадр в 37 мс вместо 7 — в пять с лишним раз. Компиляция шейдера идёт на процессоре, видеокарта её не ускоряет, а на фоне идеально гладкой картинки каждый провал заметнее. Мощная видеокарта поднимает средний FPS, но не трогает те 30 мс, которые тратит процессор.
Когда кадров «с запасом», их темп начинает гулять: видеокарта то бежит вперёд, то упирается в процессор. Поэтому разумный лимит кадров чуть ниже частоты монитора часто даёт более ровный график, чем свободный бег. Как работают VSync, VRR и почему ограничение делает картинку ровнее и уменьшает задержку, мы подробно разобрали отдельно. Здесь достаточно запомнить: с классическим VSync без VRR кадр, не успевший к обновлению экрана, ждёт следующего — и при 60 Гц время кадра скачком прыгает с 16,7 до 33,3 мс. Это тоже ощущается как микрофриз.
Как по характеру фриза понять его причину

Что реально помогает и почему

Раз механизмы разные, и лечение разное. Полезно сначала понять, какой у вас фриз, — дальше советы вытекают сами.

Шейдерный статтер: дайте игре скомпилировать заранее

Многие современные игры при первом запуске или после обновления показывают экран «Компиляция шейдеров». Не пропускайте его и не закрывайте игру, пока он идёт: это ровно та работа, которая иначе выпадет вам в бою. В Unreal Engine для этого есть система предкомпиляции PSO: движок заранее собирает всё, что может понадобиться, а если не успел — по документации может пропустить отрисовку объекта или показать материал-заглушку, лишь бы не останавливать кадр. Отсюда, кстати, иногда «появляющиеся из воздуха» объекты в первые секунды на новой локации.
В Steam есть настройка «Предварительное кэширование шейдеров». Valve описывала её так: Steam может скачать заранее скомпилированные шейдеры под вашу видеокарту, что уменьшает время загрузки и статтер в первые запуски. Важная оговорка: речь об играх на OpenGL и Vulkan. Для DirectX 12 на Windows Microsoft строит собственную систему доставки готовых шейдеров через магазин Xbox — сначала на портативках ROG Xbox Ally, а в 2026 году её обещают распространить на AMD, Intel, NVIDIA и Qualcomm.

Обновления игры и драйвера

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

Стриминг, память и фон

Игру — на SSD. Если мало видеопамяти — снизить качество текстур на ступень: картинка меняется мало, а фризы при повороте камеры часто уходят. При 16 ГБ ОЗУ и тяжёлой игре — закрыть браузер и прочее. Траверсальный статтер настройками почти не лечится: это вопрос оптимизации движка.

Чего не делать

Не верьте «магическим твикам реестра», которые «отключают статтер одной строкой». Компиляция шейдера — это реальная работа, которую нужно выполнить; её можно только перенести на другое время (загрузка, фон), но не отменить. То же с чисткой кэша шейдеров «для ускорения»: эффект ровно противоположный.

Коротко

• Средний FPS прячет одиночные долгие кадры. Смотрите на время кадра и 1% low. • Главная причина фризов на мощном ПК в DX12/Vulkan — компиляция шейдеров (PSO) на процессоре во время игры. Видеокарта её не ускоряет. • Шейдерный фриз бывает при первом показе эффекта; повторяющийся в одном месте фриз — скорее подгрузка уровня. • После обновления драйвера кэш шейдеров сбрасывается, и фризы на время возвращаются — это нормально. • Не пропускайте экран компиляции шейдеров, держите игру на SSD, не чистите кэш без причины, ставьте лимит кадров. • Больше FPS не значит плавнее: плавность — это ровность кадров, а не их количество.
0

Пока нет комментариев

Почему игра фризит при высоком FPS: статтер и шейдеры