Что такое кадров/с 99%
i5 11400frtx 3070z590 aorus por ax24 gb kingston fury 3200 mhzbe quiet sistem power 9 700wв кс го просадки до 160 фпс при разрешении 1280:960как это исправить?
Игровые компьютеры 8 месяцев назад
Очень низкий ФПС на core i7-12700
Помогите настроить биос (?) или подскажите панацею, при сборке мать: z690 UD DDR4, core i7-12700, 3060TI, нереально низкий ФПС от 40 до 70 прыгает (игра Hunt: Showdown), с предыдущим процом core i5-10500 фпс был от 80 до 100 — в чём может быть дело ?
Видеоигры 6 месяцев назад
Просадки и лаги фпс в играх.
В общем, суть проблемы такова, в открытом на ф11 меню кроссауте стал просаживаться график пинга. Следом за этим падает частота кадров. Т.к я с вертикалкой играю, то с 75 до 70-69, потом назад. Иногда подлагивают фпс даже в нетребовательных играх. И подормаживает картинка. Железо — i7-7700, аорус 2080 8 гб. 16 ГБ оператива ддр4.
Игровые компьютеры 1 год назад
Прыгает фпс в играх
Характеристики компа Ryzen 7 2700 pro msi mortar max rtx 3060 xpg d10 2 планки по 8 гб гнал до 3200 до этого стояла 1660 super , поставил новую карту rtx 3060 evga такое ощущение что ничего не поменялось, как пример в танках фпс может просидать до 70.
Разберёмся с кадрами в секунду
В этой заметке расскажу откуда появились 24 кадра в секунду, почему в США их 29,97. Зачем играм так много FPS и почему 25 кадр не работает.
Вступление
Любая анимация существует благодаря инертности зрения. Если изображения сменяются достаточно быстро, то мозг не видит их по отдельности, а создаёт иллюзию непрерывного движения. Скорость смены изображений должна быть выше 10-12 в секунду, иначе мозг воспринимает картинки по-отдельности. Казалось бы, вот и подходящая для человека кадровая частота — 12 FPS и больше. Но не всё так просто.
Немые фильмы
Представьте себе ленту немого фильма, в которой 1 500 отдельных изображений. Если мы покажем фильм со скоростью 12 кадров в секунду, то увидим что-то такое. Гифку сделал по ссылке, чтобы не раздражала мерцанием.
Движение есть, но мерцание в кадре всё портит. Оно появилось из-за того, что мы должны закрыть проектор, чтобы прокрутить ленту дальше и показать новое изображение. По словам Томаса Эдисона, наше зрение не заметит мерцание, если мы будем прокручивать ленту со скоростью 46 кадров в секунду. Но это не лучший вариант, и вот почему.
Сейчас у нас фильм состоит из 1 500 изображений и мы его проигрываем со скоростью 12 кадров в секунду.
Получается 1 500 кадров / 12 кадров в секунду = 125 секунд
Значит, нам достаточно 1 500 кадров, что создать двухминутный фильм.
Со скоростью 46 кадров в секунду наш фильм будет идти всего 32 секунды. То есть, чтобы восстановить хронометраж мы должны создать не 1 500 кадров, а 5 750 = 125 секунд * 46 кадров в секунду. Кинолента будет длиннее в четыре раза, количество кадров больше, а значит отснять, смонтировать и показать фильм выйдет намного дороже.
Легче изменить конструкцию проектора. Поэтому вместо обычного обтюратора поставили трёхлезвийный.
Теперь один кадр показывают три раза и только потом сменяют на новый. Получается частота кадров (хоть и одинаковых) увеличилась. Количество мерцания увеличилось по количеству, но в три раза сократилось по времени. Таким образом инертность зрения стала «съедать» мерцание в кадре.
Мы сменяем кадры со скоростью 16 FPS, но зрителям показываем один и тот же кадр три раза.
И получаем 48 спроецированных кадра в секунду = 16 кадров * 3 повторения. Прямо как и хотел Эдисон, даже лучше.
Мы взяли 16 FPS, а не 12 или 14, так как 16 — минимальное целое число, которое умножается на 3 и в результате даёт число больше 46.
Вот мы и получили первую кадровую частоту — 16 FPS для немых фильмов. Плюс немых фильмов в том, что мы можем легко увеличить или уменьшить количество кадров в секунду, это повлияет только на скорость воспроизведения. Ручку проектора крутил человек и мог варьировать скорость кадров от 14 до 26 FPS.
Звук
Всё сложнее стало со звуком. Теперь нельзя крутить фильм быстрее или медленнее. Нужно соблюдать постоянную кадровую частоту, чтобы скорость, а значит и тембр голоса не изменялся на протяжении фильма. С 16 FPS была проблема, звук не звучал точно, как задумывалось. Нужно было выбрать новую частоту, чтобы она была больше 16 и в итоге давала 48 проецируемых FPS. В итоге, вместо трёхлезвийного обтюратора стали использовать двулезвийный. И утвердили новый фрейм рейт — 24 FPS.
24 кадра * 2 повторения = 48 проецируемых кадров в секунду. Всё просто и удобно. 24 нацело делится на 2, 3 и 4. То есть мы знаем, что половина секунды — 12 FPS, треть — 8, а четверть — 6.
Тут вроде становится понятно — мы и сейчас используем 24 FPS. Тогда зачем нам 25, 30 и тем более 29,97?
Телевизор
Когда решили транслировать изображение по телевизору возникли новые проблемы. Показывать два раза один и тот же кадр было не вариант, да и технически это было сложновато. Ещё надо передать аналоговый сигнал по радиоволнам. И чем больше кадров, тем больше вес файла — значит канал передачи должен быть шире, а значит и дороже. Поэтому стали передавать кадры по половинкам — полукадрами. Разбиваем изображение на полосы и показываем сначала все нечётные, а потом все чётные. Инертность зрения делает своё дело и мы видим целый кадр.
Кадр из людей в чёрном 3
В телевизоре происходит то же самое, только намного быстрее.
По-умному, это называется чересстрочная развёртка и обозначается буквой «i», от слова «interlaced». Ролик с чересстрочной развёрткой и разрешением 1920 × 1080 будет называтся 1080i. А такой же ролик с прогрессивной развёрткой — 1080p. Это означает «progressive» или то, что кадры передаются целиком.
Чтобы не было лишних шумов и конструкция телевизора была проще, полукадры решили обновлять с частотой электросети. Для Европы это 50 Гц. Получилось 50 полукадров в секунду или 25 целых кадров в секунду. В США частота электросетей 60 Гц, значит полукадров будет 60, а кадров соответственно 30.
И вот вроде как всё хорошо, но тут появляется цвет.
Цвет
Теперь через тот же канал нужно донести больше информации. Мы должны передать чёрно-белое изображение для старых телевизоров, цветное изображение и звук. И сделать это было довольно сложно. Потому что как только мы добавляем в электромагнитный спектр информацию о цвете его частота пересекается со звуком и создаёт помехи. Чтобы чётко разделить цвет и звук решили снизить частоту полукадров на 0,1%.
60 полукадров — 0,1% = 59,94 полукадров в секунду
59,94 полукадров в секунду/2 = 29,97 кадров в секунду
Система вещания с такой странной кадровой частотой называется NTSC и использовалась в США и ещё парочке стран.
В Европе таких сложностей не было, в качестве стандарта сразу взяли PAL, который был создан, чтобы решить проблемы с цветом. Поэтому как было 25 кадров в секунду, так и осталось.
>30 FPS
Зачем же тогда делают фильмы в 60 FPS?
Дело в том, что камера размывает любое резкое движение в сторону направления объекта. Величина размытия зависит от расстояния, которое объект прошёл за 1 кадр. И чем больше количество кадров в секунду, тем меньше размытие.
1 секунда / 25 фпс = 0,04
1 секунда / 60 фпс = 0,016
Это называется моушн-блюр.
Разница между фильмами с 25 FPS и 60 FPS только в плавности движения. Резкие движения в фильме выглядят менее размытыми. За счёт этого картинка кажется более реалистичной. Вот в этом и смысл.
25 кадр
Представьте, что мы берём книгу в которой 24 страницы — 23 белые и 1 красная. Если мы пролистнём книгу за одну секунду, то точно заметим, что одна страница другого цвета. Если страниц в книге 25, то ничего не изменится. Страница не станет невидимой и тем более не будет влиять на подсознание, она просто пролистнётся не за 1/24 секунды, а за 1/25. Вот и вся разница. Даже если страниц будет больше 100 — глаз поймёт, что одна из них отличается. Абсолютно то же самое с видео.
Наше зрение не ограничивается считыванием какого-то определённого количества кадров в секунду. Различия между кадрами будут заметны и на двухстах, и на пятистах кадрах в секунду.
Слоумоушн и таймлапс
Слоумоушн это, когда мы снимаем видео с большей частотой кадров, а смотрим с меньшей — снимаем в 120, смотрим в 25.
Снимем на айфон 6 секунд в 120 FPS. Это значит, что за секунду он создаст 120 изображений. За 6 секунд — 720. А смотреть мы их будем в 25 FPS. Это значит, что 720 изображений / 25 FPS мы будем смотреть почти 29 секунд. За это время мы и рассмотрим все детали.
А если мы возьмём высокоскоростную камеру, снимем 1 секунду с фреймрейтом 5 000 FPS и посмотрим в 25 FPS.
5 000 * 1 / 25 = 200 секунд или 3 минуты 20 секунд
Одну секунду реального времени мы смотрим целых 3 минуты. Можно в деталях рассмотреть выстрел пистолета под водой.
После таких расчётов становится понятно почему Slow Mo Guys не выкладывают свои ролики в 60 FPS. Мы просто увидим меньше деталей.
5 000 * 1 / 60 = 83 секунды или 1 минута 22 секунды
Также, есть противоположность для слоумоушна — timelapse. Снимаем видео с меньшей частотой, а проигрываем с большей. Ставим штатив на балкон и делаем одну фотографию в день на протяжении года. Получается, что у нас получилось видео с частотой кадров — 1 кадр в день. За год у нас получилось 365 кадров. Теперь мы включаем скорость 25 FPS. В итоге, получаем 365 / 25 = 14,6 секунд в которые уместился целый год.
Игры
Почему тогда играм недостаточно 25 FPS? А нужно намного больше: 60 или даже 100 FPS.
Как написано в абзаце про фильмы с 60 FPS — камера всегда снимает с небольшим размытием в движении. Компьютер же создаёт абсолютно чёткие изображения. Из-за этого мозгу сложнее складывать их в непрерывную картинку. И чем больше движения в игре, тем больше чётких кадров нам нужно для корректного восприятия.
Для сапёра нам хватит и 2 FPS. Два раза в секунду компьютер будет обновлять изображение на мониторе и показывать попали мы в бомбу или нет. А для Counter-Strike не хватит и 30. Просто потому, что движения там слишком динамичные.
Конечно, игры научились включать искуственное размытие, но оно похоже только мешает игровому процессу. По крайней мере, я не знаю ни одного человека, который включает моушн-блюр в играх. Да и система лишний раз нагружается.
На восприятие также влияет то, что фильмы мы смотрим с постоянной кадровой частотой. В играх же, в зависимости от происходящего, FPS меняется. Как только FPS резко падает, мозг сразу же замечает это. То же самое было бы и с фильмами, если бы кадров в секунду было то 25, то 60.
FPS для игр важен не только для комфортного восприятия игры. Частота кадров равна частоте обновления физической модели. Это значит, чем больше FPS, тем чаще компьютер проверяет сделали вы выстрел или нет. Иногда эти доли секунды важны.
Похоже, что всё, что хотел рассказать — рассказал. Вот кратко все тезисы этой заметки.
Итоги
1) Первый фрейм рейт — 16 FPS
2) Звук увеличил кадровую частоту и сделал её постоянной — 24 FPS
3) Частота электросети определила новую кадровую частоту для телевизоров — 25 FPS и 30 FPS
4) Цвет превратил 30 FPS в 29,97 FPS из-за того, что не дружил со звуком
5) Фильмы в 60 FPS плавнее
6) Слоумоушн — снимаем с бóльшим FPS, смотрим с меньшим. В таймлапсе наоборот
7) Игры генерируют абсолютно чёткие кадры, поэтому нужно больше FPS, чтобы создать плавное движение
8) В фильмах кадры в секунду постоянные, в играх зависят от ситуации
Ещё раз о показателях игровой производительности — средние величины, процентили, 1% и 0.1% низкие FPS
Более подробно обсуждаем различные показатели игровой производительности, исправляем ошибку, допущенную в первом материале на эту тему, знакомимся с различными методами измерения и видами времени кадра
22 июня 2020, понедельник 00:02
kemiisto [ ] для раздела Блоги
реклама
В предыдущий раз мы познакомились с понятием времени кадра, а также с часто используемыми показателями игровой производительности, а именно, со средним, 1% и 0.1% низкими FPS, которые определённым образом характеризуют весь массив значений времени кадра на какой-либо игровой сцене. Необходимость использования указанных величин логических вытекает из двух простых, но важных утверждений:
- Для достижения высокого игрового комфорта важным является не только достаточно высокий средний FPS, но и высокаястабильность значений времени кадра.
- Минимальный FPS плохо подходит для целей оценки стабильности значений времени кадра, так как является единственным значением из набора данных и, как следствие, может представлять собой выброс (англ. outlier).
реклама
Упрощённо, выброс (или промах) — это единичный результат измерений, сильно отличающийся от всех остальных результатов из всего массива данных. Выброс может быть обусловлен ошибкой измерений (устранимой или нет), а может просто отражать высокую вариативность значений измеряемой величины. И вся суть проблемы выбросов как раз и заключается в том, что мы, зачастую, не можем знать, какой из двух упомянутых вариантов имеет место быть. Так, например, в нашем случае аномально низкое значение величины минимального мгновенного FPS может как отражать реально низкую производительность конкретной компьютерной системы на самом сложном кадре игровой сцены, так и быть обусловленным сторонними факторами — как минимум, не стоит забывать, что мы пользуемся многозадачной операционной системой, в которой одновременной с игровым приложением запущено ещё огромное множество программ и сервисов, способных в определённый момент задействовать разделяемые с игрой аппаратные ресурсы компьютера.
Процентили
Конечно, можно взять и просто исключить выбросы из массива данных, руководствуясь каким-либо критерием, коих, вообще говоря, существует не так уж и мало. Однако, такой подход очевидно плох в случае, когда выбросы лишь отражают высокую вариативность измеряемой величины, а так как знать наверняка, так это или нет в нашем случае невозможно, подход с исключением выбросов — это однозначно не наш выбор. Альтернативный вариант действий предполагает использование только статистических величин и методов, способных работать в условиях наличия выбросов. В статистике такие величины и методы называют выбросоустойчивыми, или робастными (от англ. robust, устойчивый). Минимальное значение, очевидно, не является робастной характеристикой набора данных, так как является единичным значением из этого набора, которое может оказаться выбросом. А вот процентили, или перцентили, напротив, робастны.
реклама
Напомню, что n-ый процентиль, обозначаемый обычно Pn, можно определить как значение, ниже которого находится n процентов значений из всего набора данных. Так, например, 99-й процентиль — значение, ниже которого находятся 99% значений из набора. В нашем конкретном случае, если 99-й процентиль времени кадра равен, скажем, 33 мс, то это означает, что у 99% кадров значение времени кадра меньше либо равно 33 мс и лишь у 1% кадров значение времени кадра больше 33 мс. Интерпретировать эти значения можно следующим образом — можно ожидать, что у 99 из 100 кадров значение времени кадра будет меньше либо равно 33 мс и только у 1 кадра оно превысит 33 мс. Аналогично и с частотой кадров, только необходимо учитывать, что в случае частоты кадров нас в первую очередь интересуют малые, а не большие процентили, например, 1-ый процентиль FPS, значение которого таково, что лишь для 1% кадров мгновенный FPS оказывается ниже или равен 1-ому процентилю, а для 99% — выше. Иными словами, можно ожидать, что только для 1 из 100 кадров мгновенный FPS будет меньше или равен 1-ому процентилю FPS, а для остальных 99, соотвественно, больше, и, таким образом, 1-й процентиль FPS является робастной заменой минимального FPS.
Учитывая тот факт, что мгновенный FPS есть величина обратная времени кадра
можно показать, что процентили этих величин связаны соотношением
реклама
то есть, имея на руках массив значений времени кадра, для вычисления 1-ого процентиля FPS необязательно вычислять значения мгновенного FPS для каждого кадра и затем считать 1-й процентиль полученных чисел, а можно вычислить 99-й процентиль времени кадра и взять обратное значение. Напомню только, что с учётом того факта, что время кадра обычно исчисляется в миллисекундах, а частота кадров в единицах в секунду, в обеих формулах появляется множитель 1000. Кстати говоря, во многих программах 1-й процентиль FPS ошибочно обозначается как 99-й, что технически, конечно, неверно, но суть должна быть ясна.
И от ошибок чужих переходим к ошибкам собственным — в прошлой заметке значения 1% low FPS и 0.1% low FPS были неправильно отождествлены с соответствующим процентилями FPS. Это неверно, так как указанные величины представляют собой среднее арифметическое значений мгновенного FPS, попавших в соответствующий процентиль. То есть, например, что-бы посчитать 1% low FPS необходимо вначале вычислить 1-й процентиль FPS, затем выбрать из всего массива значений мгновенного FPS только те, которые в этот процентиль попадают и посчитать среднее арифметическое. Мне, признаться, такая схема обработки данных не нравится, так как весь смысл использования процентилей состоит в том, чтобы нивелировать влияние выбросов, а на величины 1% low FPS и 0.1% low FPS выбросы оказывают существенно большее влияние, чем на процентили. Так что продолжим вычислять и использовать именно процентили, просто теперь будем их правильно называть на диаграммах.
реклама
Осталось только определиться с тем, какие процентили FPS считать. И здесь, как уже говорилось в прошлый раз, всё определяется негласными соглашениями в какой-либо области, и конкретно в игровых бенчмарках де-факто стандартом стали 99-й и 99.9-й процентили времени кадра и соотвествующие им 1-й и 0.1-й процентили FPS, которые мы ранее и использовали в результатах, пускай и неправильно их именуя (см. выше). Однако, в ходе анализа получаемых данных я пришёл к выводу, что 0.1-й процентиль следует исключить из результатов по следующей причине. Дело в том, что среднее время используемых игровых бенчмарков составляет порядка 1 минуты (60 секунд), так что при среднем FPS порядка нескольких десятков (скажем, 60 FPS) на выходе получается всего несколько тысяч значений времени кадра (60 c * 60 кадров/с = 3600 кадров), а 0.1% от нескольких тысяч — это всего-навсего несколько кадров (чаще всего 1-2), которые могут являться выбросами, от влияния которых мы, вообще говоря, и хотим избавиться. Иными словами, нескольких тысяч кадров попросту недостаточно, для того чтобы величина 0.1-ого процентиля была робастной. С 1-ым процентилем такой проблемы нет, так как 1% от нескольких тысяч кадров составляет уже несколько десятков кадров — величину, достаточную для робастности 1-ого процентиля. Можно было бы, конечно, обрабатывать не каждый прогон отдельно, а все прогоны вместе взятые, но, во-первых, такая обработка данных некорректна, а во-вторых, даже в этом случае понадобилось бы порядка 10 прогонов для каждого бенчмарка, что чрезмерно затратно по времени.
И последнее о процентилях, точнее, об одном особом процентиле, а именно 50-м процентиле, известном так же как медиана. Медиана, будучи 50-м процентилем, представляет собой такое число, что половина элементов из некоторого набора больше него, а другая половина меньше либо равна. Медиана часто используется в качестве так называемой меры центральной тенденции, то есть одного единственного числа, служащего (для краткости) в целях описания всего множества значений. По-простому, меры центральной тенденции часто называют «средними», и, собственно, различные виды средних величин, например, среднее арифметическое так же могут быть использованы в качестве меры центральной тенденции. Ранее, мы так и поступали, считая средний FPS как среднее арифметическое значений мгновенного FPS. Однако, у среднего арифметического есть один важный недостаток, которого (отчасти) лишена медиана — среднее арифметическое не является робастной величиной, а оценки медианы (обычно) робастны.
Классическим примером ситуации, в которой неробастность среднего арифметического проявляет себе во всей красе является подсчёт среднего дохода. Будучи посчитанным как среднее арифметическое, средний доход зачастую будет выше, чем доходы большинства людей, так как высокий доход нескольких людей с большим отклонением от среднего делает сильный перекос среднего арифметического. Например, если 19 работников предприятия получают по 5000 ₽ в месяц, а генеральный директор — 1 млн ₽, то средняя зарплат, посчитанная как среднее арифметическое, составит чуть больше 50000 ₽. Прямо как в том анекдоте: чиновники едят мясо, простые люди — капусту, а в среднем мы все едим голубцы.
Медиана же, в отличие от среднего арифметического, справляется с наличием такого сильного перекоса — средний доход по медиане в указанном примере составляет 5000 ₽. Конечно, при большем количестве усредняемых значений влияние выбросов на среднее арифметическое будет снижаться, но тем не менее, скажем, в штате, где официально декларирует свой доход какой-нибудь Джефф Безос, влияние его дохода на среднее арифметическое значение всё ещё может быть существенным. В нашем случаем, с несколькими тысячами значений времени кадра, мне пока ни разу не довелось наблюдать существенного расхождения между средним арифметическим и медианой, однако, далее будем использовать именно медиану. Во-первых, потому, что робастность этой характеристики в целом выше, чем у среднего арифметического, а во-вторых, для единообразия — математический смысл медианы аналогичен таковому у 1-ого процентиля (так как медиана, собственно, тоже суть есть процентиль, только 50-й).
Время кадра
Обсудив, каким образом мы будем обрабатывать данные, переходим к описанию процесса их получения. И начнём, пожалуй, с того, что измерение чего-бы то ни было, во-первых, предполагает получение «на выходе» некоторого числового значения (или нескольких значений) совместно с используемой единицей измерения, а во-вторых, характеризуется определённой точностью. При этом точность измерений объединяет такие понятия как правильность измерений и их прецизионность, первое из которых описывает близость результата измерений к истинному значению измеряемой величины, а второе — близость результатов нескольких измерений друг к другу. При этом точность измерений (в обоих смыслах) зависит в первую очередь от метода измерений, так что с обсуждения метода измерений времени кадра мы и начнём.
Методы измерения времени кадра
Итак, мы измеряем время кадра, о котором уже писалось подробнее ранее. Измеряем используя программный метод, а именно, с помощью утилиты PresentMon. Что же можно сказать о правильности и прецизионности таких измерений? Начнём с правильности. Вообще говоря, тема правильности измерений времени кадра программным методом слишком обширна для подробного обсуждения, к тому же хорошо раскрыта в многочисленных обзорах программного-аппаратного комплекса NVIDIA FCAT, например в статьях на overclockers.ru (1, 2), а также на ixbt.com и hardwareluxx.ru (1, 2, 3). Интересующиеся могут ознакомиться с материалами по приведённым ссылкам, здесь же мы позволим себе лишь краткое резюме. С одной стороны, можно утверждать, что точно (в смысле правильно) измерить время кадра, т.е. разницу во времени между двумя реально выведенными на экран друг за другом кадрами, возможно только с помощью программно-аппаратных решений. С другой стороны, программно-аппаратные решения:
- Требуют наличия дополнительной компьютерной системы, оснащенной высокопроизводительной картой видеозахвата, а также высокопроизводительной и ёмкой подсистемой хранения данных для записи несжатого материала (обычно RAID-массив из SSD-накопителей).
- Значительно увеличивают время проведения тестов и время их анализа.
- И, наконец, в большинстве случаев выдают результаты незначительно отличающиеся от полученных программным способом измерений.
По поводу последнего утверждения, необходимо пояснить, что несмотря на то, что программная методика не является 100% точной в смысле истинности получаемых абсолютных значений времени кадра, она хорошо показывает себя для целей выяснения относительной производительности компьютерных систем, которая обычно и интересна. На этом, в принципе, можно было закрыть тему обсуждения программного метода измерения времени кадра, если бы не ещё один важный нюанс.
Время кадра: rendered vs. displayed
Рендеринг кадра — процесс технически сложный, включающий множество этапов, оформленных в конвейер. Вот, например, упрощенная блок-схема графического конвейера, взятая из руководства пользователя NVIDIA FrameView — одной из утилит мониторинга, основанной на PresentMon.
Упрощённо работу графического конвейера можно описать следующим образом:
- Вначале за некоторое время T_game игровой «движок» совершает все необходимые расчёты, результатом которых является список инструкций некоторого графического API (например, Direct3D), необходимых для отрисовки кадра.
- На отметке времени T_present игровой «движок» передает список инструкций в среду выполнения графического API, где высокоуровневые инструкции и шейдеры транслируются в низкоуровневые команды, понятные графическому драйверу.
- Затем драйвер транслирует полученный список команд в список машинных инструкций, понятный уже конкретному установленному в системе графическому процессору.
- Далее графический процессор исполняет полученный набор инструкций, формируя кадр в видеопамяти. На отметке времени T_render кадр уже полностью отрисован и готов к отсылке на дисплей.
- На заключительной стадии графический процессор отправляет готовый кадр на монитор. T_display — момент времени, когда кадр отображен на дисплее (полностью или частично в зависимости от настроек вертикальной синхронизации).
Теперь зададимся вопросом: по каким из указанных отметок времени следует считать время кадра как разницу во времени между двумя кадрами, проходящими через графический конвейер? С теоретической точки зрения максимально корректно было бы считать время всякого i-ого кадра равным T_display[i] — T_display[i-1], то есть по отметкам в самом конце графического конвейера, а не в самом его начале (T_present[i] — T_present[i-1]) или где-то посередине. Почему? Как минимум, потому, что на дисплее может быть отображено меньше кадров, чем поступило в графический конвейер или даже прошло его несколько ступеней. Как минимум, такой способ измерений не учитывает наличие так называемых «отброшенных», или «выпавших», кадров (dropped frames) и «неполноценных», или «карликовых», кадров (runt frames). «Отброшенные» кадры — это кадры, попавшие в графический конвейер, но до экрана так и не добравшиеся, так как во время их продвижения по конвейеру «что-то пошло не так». Например, кадр может быть отброшен, если его отрисовка заняла слишком много времени, за которое игровая ситуация уже успела измениться, так что надобности в выводе этого кадра на экран уже нет. «Неполноценные» кадры — это кадры, которые таки добираются до дисплея, но выводятся на него лишь на мгновение, так что отображаются в очень небольшой части экрана и не воспринимаются человеком.
Собственно, самым главным недостатком большей части чисто программных методов определения времени кадра (например, FRAPS) как раз и является та их особенность, что они измеряют лишь разницу во времени между отсылкой двух следующих друг за другом кадров на конвейер, то есть разницу между отметками времени в самом начале графического конвейера, в то время как программно-аппаратные комплексы измеряют время кадра в самом конце графического конвейера. На данный момент, впрочем, существуют и чисто программные решения, способные измерять время кадра по отметкам времени в конце графического конвейера. Так, например, используемый нами PresentMon умеет измерять не только T_present, но и T_display. Однако, повторим, что точно (в смысле правильно) измерять разницу во времени между реальным выводом на экран двух следующих друг за другом кадров возможно только с помощью программно-аппаратных решений. Всё дело в том, что чисто программные методы могут быть «обмануты» драйвером видеокарты, который легко может скрыть факт наличия «отброшенного» или «неполноценного» кадра, отрапортовав, что весь процесс рендеринга прошёл в штатном режиме и кадр был полностью выведен на экран. Единственный способ быть однозначно уверенным, что кадр был полностью выведен на экран — это тщательный анализ видеопотока, полученного путём захвата кадров с одного из выходных интерфейсов видеокарты. Но как уже было сказано выше, на практике для целей сравнительного анализа игровой производительности в большинстве случаев достаточно и точности чисто программных средств.
Итак, казалось бы, в теории отметки времени T_display лучше подходят для целей измерения времени кадра, чем отметки времени T_present, однако, в абсолютном большинстве случаев используют именно последние, так как в использовании первых имеется, как минимум, одно большое «но». И имя этому «но» —DirectX 12, или, точнее, отсутствие в нём классического эксклюзивного полноэкранного режима (exclusive fullscreen mode) и необходимость определённых манипуляций для запуска DirectX 12 приложений в ближайшем аналоге этого режима. Суть, вкратце, состоит в том, что в DirectX 12 есть возможность запускать полноэкранные приложения лишь в режиме окна без рамки (borderless windowed mode), при этом игра, запущенная в таком режиме не получает видеобуфер в своё безраздельное пользование, а как и любое другое оконное приложение записывает данные в свой собственный буфер, а затем диспетчер окон рабочего стола (англ. Desktop Window Manager, DWM) компонует буфер каждой программы в окончательное изображение, которое и выводится на экран.
С одной стороны такой подход позволяет легко использовать различные визуальные эффекты, которые объединяют элементы нескольких приложений, например прозрачность и оверлеи, а так же упрощает переключение между полноэкранным и остальными приложениями и использование многомониторных конфигураций. С другой — в работе DWM есть одна важная особенность, которую необходимо учитывать при проведении замеров времени кадра по выходу из графического конвейера: для предотвращения мерцаний и разрывов картинки DWM использует двойную буферизацию, меняя текущий первичный буфер (из которого осуществляется вывод информации на экран) на текущий вторичный буфер (в котором содержаться результаты обработки следующего кадра) только в момент завершения вертикальной развёртки монитора. Как результат значения времени кадра по выходу из графического конвейере, то есть посчитанные по отметке времени T_display, могут быть лишь числами, кратными величине, обратной частоте развёртки монитора. Так, например, для монитора с частотой развёртки 60 Гц, возможны лишь значения времени кадра, кратные 1/60=0.016(6) с, или 16.6(6) мс. Фактически кадровая частоты в таком случае оказывается синхронизирована с частотой вертикальной развёртки монитора аналогично ситуации с использованием вертикальной синхронизации (V-Sync), вот только в отличие от V-Sync выключить двойную буферизацию DWM невозможно.
На самом деле у разработчиков есть возможность обойти DWM при использовании DirectX 12, чтобы избавиться от вышеупомянутой синхронизации частоты кадров с частотой вертикальной развёртки монитора (необходимо использовать модель представления True Immediate Independent Flip), однако, многие DIrectX 12 игры эту возможность не используют. Как результат, на практике получаем такую картину:
На рисунке сверху отображены значения времени кадра, посчитанные по отметкам времени в начале (оранжевый график) и в конце графического конвейера (зелёный) для нескольких первых секунд встроенного бенчмарка Metro Exodus, запущенного в режиме DirectX 12. Так как данные получены на мониторе с частотой развёртки 60 Гц, а указанный выше механизм «обхода» DWM игра не использует, то время кадра по выходу из графического конвейера строго кратно 16.6(6) мс. Мало того, что на значения времени кадра в конце графического конвейера влияет такой абсолютно внешний фактор, как частота развёртки используемого монитора, так даже при использовании одного и того же монитора, накладываемое на значения времени кадра ограничение может сильно скрадывать разницу в производительности двух систем. В теории, конечно, можно использовать время кадра по выходу из графического конвейера, а влияние указанного ограничения нивелировать, используя монитор с высокой частотой развёртки, скажем, 240 Гц, но на практике большинство просто использует время кадра по входу в графического конвейера, так как в абсолютном большинстве случаев, когда указанного ограничения нет, разница между значениями, посчитанными по разным отметками незначительна.
Время кадра: прецизионность измерений
С точностью измерений, можно считать, разобрались, теперь скажем несколько слов об их прецизионности, которая, напомню, есть близость результатов нескольких измерений друг к другу. Конечно, оценивать близость результатов измерений значений времени каждого единичного кадра технически сложно да и бессмысленно, так как, строго говоря, получить идентичную последовательность кадров в двух тестовых прогонах практически невозможно. Так что прецизионность имеет смысл оценивать лишь по статистическим характеристикам всего набора значений времени кадра, то есть, например, по выбранным для анализа процентилям. В идеальной ситуации, то есть на хорошо повторяемой последовательности кадров (обычно реализуемой посредством встроенного бенчмарка) стандартное отклонение по 3-5 прогонам составляет максимум чуть больше 1 FPS для показателей медианы и 1-ого процентиля FPS. Таким образом даже в таком идеальном с точки зрения прецизионности измерений случае значения указанных величин имеет смысл приводить только в целочисленном виде, а о десятых (и уж тем более сотых) долях FPS не может идти и речи.
При тестировании же на случайных игровых сценах (ручная «пробежка» участка определённого игрового уровня) ситуация значительно хуже — статистические погрешности значительно выше, особенно на не самых производительных системах. Достаточно банально повернуть голову в сторону в одной конкретной сложной сцене на одном проходе и не повернут на другом, чтобы получить существенно различающиеся значения показателей игровой производительности. Страдают, конечно, в первую очередь малые процентили, но бывают и ситуации, когда от прогона к прогону сильно «гуляет» и значение медианного FPS, так что ему нельзя верить даже с точностью до целых. Фактически здесь приходится выбирать — либо максимальный охват актуальных игровых проектов при невысокой прецизионности результатов, либо высокая прецизионность результатов, но полученная лишь для небольшого числа проектов со встроенным бенчмарком. Можно сказать, что мы здесь выбираем что в первую очередь тестируем — игры или «железо»? Мне интересно тестирование именно «железа», так что хотелось бы иметь хорошо воспроизводимые результаты, в которых не приходилось бы сомневаться даже при сравнительно небольшом числе тестовых прогонов. Так что мой выбор пал на игры со встроенным бенчмарком. Кроме того, прогоны встроенного бенчмарка практически всегда возможно автоматизировать, что значительно снижает трудозатраты на тестирование.
Конечно, в теории всегда можно попытаться автоматизировать передвижение персонажа по игровому миру, так чтобы получить хорошо воспроизводимую последовательность кадров даже в играх без встроенного бенчмарка. Но это в теории, а на практике, реализовать это технически сложно, так что даже если не помешает античит или крупное обновление, которое сломает необходимые файлы сохранений или удалить используемую для тестов локацию, трудозатраты слишком велики. Каждый, как мне кажется, должен заниматься своим делом — написать встроенный бенчмарк разработчикам игры в разы проще, чем сторонним тестировщикам производительности. При том, что такой бенчмарк для внутреннего использования безусловно пишется почти в любом случае, а понять мотивы, побуждающие не делать его доступным для простых смертных крайне трудно.
В любом случае, пока, резюмируя:
- Тестируем на небольшом числе проектов со встроенными бенчмарками.
- Измеряем время кадра программно, по отметкам времени в начале графического конвейера.
- В качестве робастной характеристики среднего и минимально FPS используем медиану и 1-й процентиль, соответственно.
Показатели игровой производительности — что такое средний, 1% и 0.1% низкие FPS
В этой заметке кратко поговорим о трёх важных метриках, которые на сегодняшний день крайне часто используются при измерении игровой производительности, но суть которых всё ещё понятна далеко не всем.
2 марта 2020, понедельник 08:29
kemiisto [ ] для раздела Блоги
реклама
За последние годы можно наблюдать всё растущее понимание, что одного только среднего FPS по какой-либо выбранной для целей тестирования игровой сцене недостаточно для описания производительности компьютерной системы, а минимальный и максимальный FPS в этом деле совсем не помощники. Давайте разберёмся, в чём недостаток среднего FPS, чем так плох минимальный FPS, а также познакомимся с набравшими популярность более удачными мерилами игровой производительности — показателями 1% и 0.1% низкие FPS.
Кадр из ролика What Are 1% & 0.1% Lows? канала Gamers Nexus
Время кадра, мгновенный и средний FPS
Отрисовка каждого кадра в игре занимает некоторое время, которое называется, временем отрисовки кадра, или, коротко, временем кадра (frame time). Исчисляется время кадра обычно в миллисекундах (мс), т.е. тысячных долях секунды. Однако в игровых бенчмарках вместо этой характеристики много чаще используется частота смены кадров или, коротко, частота кадров (frame rate), равная количеству кадров, отрисованных за единицу времени. Измеряется частота кадров в количестве кадров в секунду (frames per second, fps), и для краткости частоту кадров также очень часто также именуют аббревиатурой от названия её единицы измерения, т.е. FPS.
реклама
Между временем кадра и частотой кадров есть очевидная математическая связь: значение FPS, подсчитанное непосредственно после отрисовки очередного кадра, именуемое обычно мгновенным FPS, есть величина обратная времени этого кадра:
Необходимо только учесть, что время кадра обычно исчисляется в миллисекундах, а частота кадров в единицах в секунду, поэтому итоговая формула для мгновенного FPS будет такова:
реклама
Так, например, если очередной кадр был отрисован, скажем, за 16 мс, то сразу по окончании его отрисовки мгновенный FPS был равен 1000/16 = 62.5 кадра в секунду.
Но главное мерило производительности, это, конечно же, средний FPS по всей игровой сцене, который с одной стороны представляет собой не что иное, как количество кадров n, отрисованных за всё время бенчмарка t
реклама
С другой же стороны, средний FPS можно вычислить как величину, обратную среднему времени кадра
но ему в общем случае не равно. При ближайшем рассмотрении видно, что равенство будет иметь место лишь в частном случае, когда все ti равны между собой (t1=t2=. =tn), то есть когда значения времени всех кадров идентичны, что, конечно же, практически невозможно.
Вообще, те читатели, кто неплохо знаком с физикой и математикой, тут уже кое-что должны были увидеть. Если вкратце, то, в математике для некого набора чисел
помимо всем хорошо знакомого среднего арифметическогосуществует ещё несколько средних величин, из которых нам интересна здесь лишь одна, а именно, среднее гармоническое
Если словами, то среднее гармоническое по некоторому набору чисел есть обратная величина к среднему от обратных к числам величинам. Звучит, конечно, несколько кошмарно, и не очень понятно, зачем вообще нужно, но сейчас разберёмся. Давайте сразу скажем, что в общем и целом две обсуждаемые средние величины не равны друг другу, за исключением частного случая равенства всех чисел в наборе, x1=x2=…=xn, того самого случая, который для среднего FPS мы отмечали выше.
Так же как и среднее арифметическое, среднее гармоническое находит своё применение в ряде практических задач. Так, например, если некоторый объект несколько раз подряд преодолевает одно и тоже расстояние с разной скоростью, то его средняя скорость на всём пути есть среднее гармоническое скоростей на всех участках. То есть если n раз проехать расстояние d со скоростями v1, v2, …, vn, то время прохождения каждого отрезка составит ti = d/vi, а средняя скорость, равная по определению отношению длины пути, пройденного телом, ко времени, за которое этот путь был пройден, будет равна
т.е. среднему гармоническому скоростей, а не их среднему арифметическому. Например, если Вы по пути на дачу на первом километре попали в “пробку” и двигались со скоростью 30 км/ч, а на втором километре “затор” рассосался и Вы “втопили” уже «под 90», то средняя скорость за 2 километра составила, 2 / (1/30 + 1/90) = 45 км/ч, а не (30 + 90) / 2 = 60 км/ч, в чём легко убедиться. Смотрите, Вы проехали 2 км, и если бы Ваша средняя скорость была равна 60 км/ч, то на дорогу у Вас ушло бы всего навсего 2 км / 60 км/ч = 1/30 ч, т.е. 2 минуты. В реальности же только на первый километр Вы уже потратили 1 км / 30 км/ч = 1/30 ч, эти самые 2 минуты, а затем ещё 1 км / 90 км/ч = 1/90 ч (чуть меньше минуты) ушло на второй километр.
Вообще, среднему арифметическому от скоростей средняя скорость равна лишь тогда, когда тело двигалось с этими скоростями одинаковые промежутки времени, а не одинаковые участки пути, но это уже, как должно быть понятно, не наш случай. Почему? Здесь всё просто — мгновенный FPS суть есть скорость смены кадров на участке длиной в 1 кадр, а не продолжительностью в 1 секунду, а значит и среднюю скорость (средний FPS) следует считать как среднее гармоническое значений мгновенного FPS, а не их среднее арифметическое.
Минимальный, 1% и 0.1% низкие FPS
Что ж, со средним FPS разобрались, едем дальше. Собственно, очень давно известно, что использование каких-либо средних величин в качестве единственных характеристик некоего набора данных — всегда плохая идея. Так, например, в нашем конкретном случае необходимо понимать, что время каждого кадра напрямую зависит от его сложности, и периодически в игре могут встречаться кадры со сложностью, существенно превышающей среднюю, на отрисовку которых, как следствие, уходит заметно больше времени. В результате такие “длинные” кадры задерживаются на экране существенно дольше и могут приводить к визуально заметным “подтормаживаниям” и “фризам”, способным испортить всё удовольствие от игры. И тут надо понимать, что такие “длинные” кадры часто бывают редкими, и проблема использования среднего FPS и состоит как раз в том, что в процессе усреднения значений времени кадра информация о “длинных” редких кадрах теряется.
Поясню на небольшом примере. Пускай, за 1 секунду игрового времени было отрисовано 30 кадров со следующими значениями времени отрисовки в мс:
48, 35, 33, 31, 14, 38, 29, 24, 17, 16, 90, 21, 43, 36, 19, 22, 10, 11, 37, 26, 28, 18, 27, 98, 50, 47, 25, 42, 44, 21
Среднее время кадра равняется 33 мс, а средний FPS — 30 кадрам в секунду. Казалось бы, всё неплохо, но обратите внимание на присутствие парочки очень “длинных” кадров (выделенных жирным шрифтом) со временем отрисовки втрое большим среднего, а именно, 90 и 98 мс. При усреднении значений времени кадров информация о наличии столь “длинных” пускай и редких кадров была потеряна, и в результате полученные средние величины вроде бы сигнализируют о достижении минимального порога играбельности, но на деле визуально заметные “просадки” и “фризы” при подобного рода наборах значений времени кадра неизбежны.
Чем же дополнить средний FPS, чтобы лучше описать весь набор значений времени кадров? Возможно, минимальным значением? Нет, не стоит. Дело в том, что минимальный мгновенный FPS, как любой единичный элемент набора данных, может оказаться грубым выбросом. Например, минимальное значение мгновенного FPS может оказаться таковым не по причине сложности соответствующего кадра, а из-за внешних факторов, например, запланированного старта какой-нибудь службы Windows ровно в момент отрисовки этого кадра. При этом, устранить все внешние факторы, которые могут повлиять на единичное значение мгновенного FPS, практически невозможно, и, что важнее, этого и не требуется, при грамотном подходе к описанию имеющегося набора данных. Но каков же этот грамотный подход?
В математической статистике существует понятие процентиля, которое для наших целей можно определить как значение, ниже которого находится определённый процент данных из набора. Например, 99-процентиль — значение, ниже которого находятся 99% данных из набора. В нашем примере с 30 кадрами, отрисованными за 1 с, 99-процентиль равен 96 мс, и означает это, что 99% значений времени кадра из нашего набора меньше 96 мс, и лишь 1% больше или равен этому значению. Обратите особое внимание, что в нашем конкретном случае из-за малого числа данных в наборе существенной разницы между минимальным значением и 99-процентилем нет, и, как следствие, 99-процентиль здесь ничем не лучше минимального значения в отношении грубых промахов. По сути из всего нашего набора данных лишь единственное значение (минимальное) и не попало “под” 99-процентиль. Однако, если набор данных будет существенно больше, скажем, будет содержать время отрисовки нескольких тысяч кадров, то “длинных” кадров, не попадающих “под” 99-процентиль будет уже порядка нескольких десятков и вместо единственного минимального значения, которое, возможно, является грубым выбросом, у нас будет иметься уже какая-никакая статистика по всем редким “длинным” кадрам. Это обеспечит не только более адекватное описание набора данных, но и значительно лучшую воспроизводимость результатов.
Надеюсь, теперь понятно, чем так хороши процентили, и здесь осталось прояснить лишь какие конкретно процентили использовать. И тут всё, по большому счёту, определяется негласными соглашениями в какой-либо области, и в игровых бенчмарках де-факто стандартом стали 99- и 99.9-процентили времени кадра. Точнее, как уже отмечалось выше, в игровых бенчмарках обычно приводят значения FPS, поэтому и вместо 99- и 99.9-процентилей времени кадра в результатах обычно фигурируют обратные им 1- и 0.1-процентили FPS, именуемые 1% низкий FPS и 0.1% низкий FPS, соответственно. При этом следует понимать, что 1% и 0.1% от всего набора данных — это лишь небольшая часть данных, описывающая редкие и крайне редкие игровые события. Поэтому в самом факте, что 1% низкий FPS и 0.1% низкий FPS оказываются зачастую значительно ниже среднего FPS нет ничего страшного — такая картина лишь говорит о том, что сложность кадров в игровой сцене непостоянна, что совершенно нормально. Плохо лишь, если обсуждаемые показатели «просаживаются» на конкретной игровой системе слишком сильно, выходя за границы играбельности, так как в этом случае нас ожидают визуальные неприятности.