Высокий средний FPS, но плохие 1% low: что это значит

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

Счётчик показывает 200, а игра ощущается как 90. Ничего не сломано, ничего не замирает на целую секунду, но перестрелка ни разу не ощущается так, как обещает число. У этого ощущения есть название и есть измерение, и как только ты научишься его читать, ты перестанешь гоняться не за тем числом.

Сначала честная фраза. Эта страница объясняет измерение, а не исправление. w0a нигде не печатает цифру «выигрыш FPS», так что помогло ли изменение, ты читаешь по собственным записям до и после, на фоне собственного шума от прогона к прогону, — а каждое число ниже можно пересчитать из файла, который сохраняет страница Бенчмарк.

Что эти три числа означают на самом деле

Отсортируй все кадры прогона от самого медленного к самому быстрому.

Время кадра — это те же данные в миллисекундах, и арифметику стоит запомнить, потому что она делает всю остальную страницу предметной: 16,7 мс — это 60 FPS, 6,9 мс — 144, 4,2 мс — 240.

Значит, прогон со средним 200 и 1% low, равным 70, — это прогон, где типичный кадр занял около 5 мс, а худшая сотая — около 14, почти втрое дольше. А на 200 FPS один процент твоих кадров — это два кадра каждую секунду. Дважды в секунду картинка стоит на месте столько времени, сколько ушло бы на три кадра. Именно это ты и чувствуешь, и никакое среднее тебе об этом не скажет.

Читай разрыв, а не число

1% low, равный 70, — прекрасный результат в прогоне на 90 FPS и тревожный в прогоне на 200. Полезно читать соотношение:

Что ты видишьЧто это обычно значит
Среднее и 1% low близки друг к другуРовная выдача кадров. Вот что такое «плавно», даже на скромной частоте кадров.
1% low сильно ниже среднегоЧто-то прерывает в остальном здоровый прогон: событие, а не нагрузка.
0.1% low сильно ниже 1% lowРедкие глубокие события: сброс драйвера, шторм подкачки, долгое чтение с диска.
Всё низкое разомТы просто просишь больше, чем выдаёт железо. Понизь настройку.

Третью строку легко прочитать неправильно. Если 1% low у тебя в порядке, а 0.1% low ужасен, у тебя проблема не с равномерностью — у тебя горстка конкретных происшествий, а происшествия можно найти.

Почему плохой хвост — это другая проблема, чем низкое среднее

Низкое среднее — это вопрос нагрузки: машина делает столько, сколько может, и этого не хватает. Ответ — настройка, разрешение или другое железо.

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

Есть и промежуточный случай: машина, которая в среднем не упирается в видеокарту, но упирается в самые загруженные моменты. Отстающие кадры — ровно те кадры, где происходит больше всего, то есть перестрелка. Если видеокарта сидит заметно ниже полной загрузки, а нижние значения при этом страдают, страница диагноза для этого — Видеокарта не на 100%.

Дисциплина измерения, без которой всё это не имеет смысла

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

Поэтому запись полезна только рядом с собственным шумом. Страница Бенчмарк «до / после» вычисляет шум измерений из разброса самой записи от минуты к минуте и печатает его отдельно для среднего, для 1% low и для 0.1% low — и не станет заявлять о разнице, которая попадает внутрь него. В одном поведении здесь вся дисциплина: результат меньше твоего собственного разброса от прогона к прогону — не результат.

Практическая версия:

  1. Та же игра, та же карта или повтор, та же длительность, те же настройки в игре.
  2. Играй одинаково. Прогон, проведённый лицом к стене, и прогон, проведённый в перестрелке, несравнимы.
  3. Прогони неизменённую конфигурацию хотя бы три раза, прежде чем что-либо менять, — чтобы знать, как выглядит твой собственный шум.
  4. Меняй одну вещь. Пять изменений и одно измерение не говорят ничего о том, какое из них сработало, а сложить пять измеренных по отдельности выигрышей — это арифметика, а не измерение.
  5. Сравнивай нижние значения. Как читать результаты бенчмарка разбирает, зачем нужно каждое число на странице.

Точная арифметика, число за числом

Вот что страница Бенчмарк делает с записью — в том порядке, в каком делает.

ШагПравилоЗачем оно
Какие кадры считаютсяТолько кадры, нарисованные, пока игра была окном на переднем плане. После того как игра возвращается на передний план, первая секунда отбрасывается; перед обнаруженной потерей фокуса отбрасываются последние 0,2 секунды. Отброшенное время сообщается вместе с прогоном.Запись начинается и останавливается из собственного окна w0a, так что её края — это игра в фоне. В одной сохранённой записи 94 из 185 кадров, стоявших за 1% low, оказались этими краями. Одна секунда — выбранное значение, а не измеренное.
ПаузыИнтервал кадра длиннее 200 мс исключается из среднего и из всех процентилей и считается отдельно.Свыше 200 мс — это экран загрузки, alt-tab или остановка драйвера, а не отрисовка. Попав в среднее, он похоронил бы под собой каждый настоящий кадр.
Средний FPSУчтённые кадры, делённые на время, которое они заняли: кадры × 1000 ÷ общее число миллисекунд.
1% lowОтсортируй учтённые времена кадров. Возьми самый медленный 1% из них — с округлением вверх и не меньше одного кадра, — усредни эти времена кадров и переведи результат в FPS: 1000 ÷ это среднее.Другое распространённое определение — частоту кадров при времени кадра на 99-м процентиле — отвергли намеренно: когда фризит ровно 1% кадров, оно попадает на границу и показывает почти то же число, что и среднее.
0.1% lowТо же самое, с самыми медленными 0,1%.
Время кадра на 99-м и 99,9-м процентилеСообщается отдельно, в миллисекундах.Для читателей и инструментов, которые пользуются определением через процентиль.
Слишком коротко, чтобы читатьМеньше 900 кадров — недостаточно, чтобы процентиль что-то значил.
Число фризовКадр длиной до одной секунды считается фризом, когда он длиннее и удвоенной медианы окружающих трёх секунд, и этой медианы плюс 8 мс.Три секунды, а не фиксированное число кадров, — чтобы правило значило одно и то же на 60 FPS и на 300. Слагаемое в 8 мс не даёт обычному дрожанию на высокой частоте кадров считаться фризом. Кадры от 200 мс до одной секунды исключены из процентилей, но здесь учитываются: заминка в 250 мс от компиляции шейдеров — ровно то, ради чего этот счёт и существует.
Порог шумаЗапись режется на блоки по 60 секунд. Каждой стороне сравнения нужно хотя бы два целых блока, иначе страница пишет «несравнимо», а не раскрашивает число. Порог — это 95-процентный интервал из разброса двух сторон от блока к блоку (метод Уэлча), в процентах от значения «до». Учитываются только целые блоки без потерянных событий, и нулевой порог не выдаётся никогда.Разница внутри твоего собственного разброса от блока к блоку — не результат.
Парные серииКогда ты гоняешь серию A/B, об изменении сообщается, только если точный знаково-ранговый критерий и 95-процентный бутстреп-интервал медианной разницы (10 000 повторных выборок) оба исключают ноль, а медиана не меньше наименьшего эффекта, который, как показал пилот из 10 прогонов, эта конфигурация способна обнаружить. Серии нужно минимум 6 пар — при 5 наименьшее возможное p-значение равно 0,0625, — а рекомендуется 8, в порядке ABBA.Одна пара «до/после» не отделит изменение от прогретой видеокарты или другой точки появления.

Проверь сам: пересчитай из CSV

Сохранить CSV на странице Бенчмарк записывает одну таблицу со столбцами side,kind,name,value. Строки с kind = metric — это итоговые цифры; строки с kind = frame — интервалы кадров, по одному на строку, с временем кадра в миллисекундах в value. Строки кадров хранят всю серию, включая паузы, — ровно для того, чтобы ты мог сам применить правило 200 мс и прийти к тем же числам.

Перед началом — две вещи:

В таблице: отфильтруй один side и kind = frame, убери строки больше 200, отсортируй value от большего к меньшему, усредни первые N строк, где N — число строк, делённое на 100 и округлённое вверх, и раздели 1000 на это среднее. Результат должен совпасть с low_1pct_fps для этой стороны.

В PowerShell (для другой стороны замени before на after):

$ms = Import-Csv .\capture.csv |
  Where-Object { $_.kind -eq 'frame' -and $_.side -eq 'before' } |
  ForEach-Object { [double]::Parse($_.value, [Globalization.CultureInfo]::InvariantCulture) } |
  Where-Object { $_ -le 200 } |
  Sort-Object
$take = [Math]::Max(1, [Math]::Ceiling($ms.Count * 0.01))
1000 / ($ms | Select-Object -Last $take | Measure-Object -Average).Average

Для 0.1% low используй 0.001 вместо 0.01. Две быстрые проверки согласованности по тому же файлу: число строк кадров со значением 200 и меньше равно метрике frames, а число строк больше 200 — excluded_over_stall_ms.

Две вещи, которые тихо портят процентиль

Генерация кадров. Вставленные кадры не несут нового состояния игры. 1% low, посчитанный по кадрам, всё ещё даёт число, но перестаёт описывать отзывчивость — а ради неё ты на него и смотрел. На время измерения генерацию выключи. Это вопрос определения, а не утверждение, что генерация кадров вызывает фризы.

Экраны загрузки и паузы. Трёхсекундная пауза на загрузке — это один «интервал кадра» длиной в три тысячи миллисекунд, и, оставшись в данных, он становится твоим 0.1% low и хоронит под собой всё настоящее. Именно поэтому такие длинные интервалы исключаются из процентилей и сообщаются отдельно — чтобы ни одно число не выросло втихую поверх одного из них.

Что не двигает 1% low

Это стоит сказать прямо, потому что эти две вещи легко смешать: функции снижения задержки и стабильность процентилей — разные утверждения. Режимы низкой задержки от производителей уменьшают глубину очереди отрисовки, и это уменьшение измерено. Опубликованных измерений, показывающих, что они улучшают процентили времени кадра, нет. Обе вещи могут быть полезны; это не одно и то же, и страница, выдающая одно за другое, тебе что-то продаёт. Чистая установка ради стабильных 1% low разбирает опубликованные свидетельства со ссылками на источники, а Задержка ввода, которую не исправит ни одна программа — честный отчёт о том, куда работа над задержкой дотягивается, а куда нет.

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

Чего страница Бенчмарк не печатает

Если нижние значения у тебя плохие и нужны причины, а не числа, список — в Почему игры фризят на Windows 11, а то, что w0a проверяет автоматически, — в Что ищет сканер фризов. Для CS2 отдельно Низкий FPS и фризы в CS2 применяет всё это к одной игре.

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

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

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

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

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

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