Кадров с 99 процентов что это
За последние годы можно наблюдать всё растущее понимание, что одного только среднего FPS по какой-либо выбранной для целей тестирования игровой сцене недостаточно для описания производительности компьютерной системы, а минимальный и максимальный FPS в этом деле совсем не помощники. Давайте разберёмся, в чём недостаток среднего FPS, чем так плох минимальный FPS, а также познакомимся с набравшими популярность более удачными мерилами игровой производительности — показателями 1% и 0.1% низкие FPS.
Время кадра, мгновенный и средний FPS
реклама
Отрисовка каждого кадра в игре занимает некоторое время, которое называется, временем отрисовки кадра, или, коротко, временем кадра (frame time). Исчисляется время кадра обычно в миллисекундах (мс), т.е. тысячных долях секунды. Однако в игровых бенчмарках вместо этой характеристики много чаще используется частота смены кадров или, коротко, частота кадров (frame rate), равная количеству кадров, отрисованных за единицу времени. Измеряется частота кадров в количестве кадров в секунду (frames per second, fps), и для краткости частоту кадров также очень часто также именуют аббревиатурой от названия её единицы измерения, т.е. FPS.
Между временем кадра и частотой кадров есть очевидная математическая связь: значение FPS, подсчитанное непосредственно после отрисовки очередного кадра, именуемое обычно мгновенным FPS, есть величина обратная времени этого кадра:
Необходимо только учесть, что время кадра обычно исчисляется в миллисекундах, а частота кадров в единицах в секунду, поэтому итоговая формула для мгновенного FPS будет такова:
реклама
Так, например, если очередной кадр был отрисован, скажем, за 16 мс, то сразу по окончании его отрисовки мгновенный FPS был равен 1000/16 = 62.5 кадра в секунду.
Но главное мерило производительности, это, конечно же, средний FPS по всей игровой сцене, который с одной стороны представляет собой не что иное, как количество кадров n, отрисованных за всё время бенчмарка t
реклама
С другой же стороны, средний FPS можно вычислить как величину, обратную среднему времени кадра
В справедливости утверждения, что средний FPS, вычисленный таким образом, совпадает с данным выше определением убедиться нетрудно, ведь время отрисовки всех кадров равно времени бенчмарка
реклама
Впрочем, всё это, в каком-то смысле, очевидно. А вот что совсем не так очевидно, так это то, что средний FPS не является средним арифметическим значений мгновенного 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 нет ничего страшного — такая картина лишь говорит о том, что сложность кадров в игровой сцене непостоянна, что совершенно нормально. Плохо лишь, если обсуждаемые показатели «просаживаются» на конкретной игровой системе слишком сильно, выходя за границы играбельности, так как в этом случае нас ожидают визуальные неприятности.
Последнее, о чём, пожалуй, стоит ещё обмолвиться, перед тем, как перейти к выводам, так это так называемый средний за секунду (или по секунде) FPS, а также характеристики на нём основанные, например, минимальный средний за секунду FPS. Этот «зверь», впрочем, простой: средний за секунду FPS — это просто средний FPS на отрезке в 1 с. Равен он количеству кадров, отображённых за одну прошедшую конкретную секунду, но, так же как и средний FPS за всё время бенчмарка, может быть посчитан и как среднее гармоническое значений мгновенного FPS за эту конкретную секунду. Обычно, именно средний за секунду FPS и отображают на экране различные счётчики частоты кадров наподобие FRAPS, так как значение мгновенного FPS пришлось бы обновлять настолько часто, что в этом месиве всё равно бы никто ничего не разобрал. Использовать же значения среднего за секунду FPS вместо значений FPS мгновенного для более детального анализа бессмысленно, так как наиболее важная информация о времени отрисовки «длинных» кадров в них уже потеряна (см. пример выше). А касательно минимального среднего за секунду FPS упомянем лишь, что он, в отличие от минимального мгновенного FPS, может быть больше, скажем, 0.1% низкого FPS, что периодически порождает путаницу и неразбериху.
Что означают 1 % и 0,1 % при тестировании видеокарт и процессоров в играх
Содержание
Содержание
Все чаще при измерении производительности ПК в играх можно заметить показатели «0.1 % Low» и «1 % Low». Большинство неопытных пользователей не придают этому значения и по старинке смотрят только на средний FPS. На самом деле эти показатели очень важны и на них стоит обращать внимание. И вот почему.
Что такое средний FPS и Frame Time
Время, требуемое для отрисовки одного кадра называется Frame time или же «время кадра». Измеряется оно в миллисекундах, но обычно используют частоту кадров (Frame rate), которая обозначает количество кадров, отрисованных за единицу времени. Частота кадров же измеряется в количестве кадров в секунду — Frames per second или же FPS.
Главная единица, используемая при измерении производительности — средний FPS (AVG FPS) за весь промежуток времени. Средний FPS находится по формуле FPS = n/t, где n — количество кадров, отрисованное за все время, а t — время проведения теста. У среднего FPS есть недостаток, который не позволяют ему быть единственной единицей измерения в бенчмарках.
0.1 % минимальный и 1 % низкий FPS
При измерении FPS его среднее значение не является точной величиной, поэтому внимание стоит уделить другим — 1 % низкий и 0.1 % минимальный FPS. В нашем случае важно понимать, что время отрисовки кадра зависит от его сложности. Во время игры могут встречаться карты с большим количеством предметов и NPC в поле видимости игрока, на отрисовку которых будет уходить больше времени. Такие кадры могут задерживаться на экране, в результате чего картинка может фризить и испортить впечатление от игры. Проблема среднего FPS заключается в том, что при замерах время «длинных» кадров усредняется с «быстрыми», поэтому информация о первых теряется.
К примеру, за секунду было отрисовано 30 кадров с таким временем отрисовки в мс:
33, 57, 23, 13, 34, 68, 34, 40, 44, 16, 90, 27, 66, 87, 23, 37, 17, 23, 31, 21, 23, 20, 37, 12, 32, 36, 22, 14, 20, 10
В данном случае средний FPS равен 30 кадрам в секунду, а среднее время отрисовки кадра — 33,3 мс. Общая картина достаточно неплоха, но если взглянуть пристальнее, то можно заметить четыре кадра, время отрисовки которых в два, а то и в три раза больше среднего. Как и было сказано ранее, при высчитывании среднего времени отрисовки кадра и среднего FPS «долгие» кадры теряются на фоне «быстрых», в результате чего значения получаются неточными.
Было принято решение как-нибудь дополнить значения среднего FPS, чтобы лучше описать все кадры.
Существует такое понятие как процентиль, с английского — percentile (в русском языке чаще встречаются персентиль или перцентиль). В нашем случае это можно трактовать как значение, ниже которого находится определенный процент данных из общего набора. У нас 99-процентиль — это значение, ниже которого находятся 99 % данных из общего числа. И, если он равен 90 мс, то 99 % значений времени кадра из примера меньше 90 мс, а 1 % больше или равен этому числу.
В бенчмарках по договоренности используются 99.9- и 99-процентили. Поскольку обычно в качестве единицы измерения применяются FPS, то в данном случае используются обратные 0.1- и 1-процентили FPS. В народе их принято называть 0.1 % минимальный и 1 % низкий FPS. Обычно эти значения оказываются ниже среднего FPS, так как это часть данных, которая описывает редкие игровые события с многочисленным количеством объектов. Это говорит о том, что сложность кадров в сцене непостоянна. Плохо это только тогда, когда 0.1 % минимальный и 1 % низкий FPS «просаживаются» до неиграбельного уровня в результате чего картинка начинает подлагивать. Правда, оценить этот неиграбельный уровень статистически невозможно — для каждого он свой в связи с особенностями человеческого глаза и привычками геймера.
Математические объяснения недостатков среднего FPS (для любознательных)
Между временем кадра и частотой кадров есть математическая связь: значение FPS после отрисовки кадра — мгновенный FPS — обратно времени отрисовки этого кадра:
Поскольку время кадра обычно измеряется в миллисекундах, а частота кадров в единицах в секунду, вышеуказанная формула будет выглядеть вот так:
Например, кадр был отрисован за 25 мс, тогда получается, что мгновенный FPS по окончании его отрисовки был равен 1000/25 = 40 FPS.
Как уже было сказано ранее, средний FPS находится по формуле FPS = n/t. Кроме нее средний FPS можно найти так:
Где t — среднее время кадра, равное t = (t1 + t2 + t3 + … + t-нное)/n
n — общее количество кадров, t1, t2, t3 и т. д. — время отрисовки каждого кадра
То есть, средний FPS — величина, обратная среднему времени кадра. Подтверждается это тем, что время бенчмарка равняется сумме времени отрисовки всех кадров:
t1 + t2 + t3 + … + t-нное = t
Но почему же средний FPS — недостаточно точный показатель измерений? Так происходит, потому что средний FPS не является средним арифметическим значений мгновенного FPS:
FPS ≠ (FPS1 + FPS2 + FPS3 + … + FPS-нное)/n
FPS ≠ (1000/t1 + 1000/t2 + 1000/t3 + … + 1000/t-нное)/n
Для подтверждения этому приведем одну из вышеперечисленных формул:
FPS = 1000n/(t1 + t2 + t3 + … + t-нное)
Значения среднего FPS и среднего значения мгновенного FPS будут равны только в том случае, когда все кадры были отрисованы за одинаковые промежутки времени – t1 = t2 = t3 = t-нное = t, что на практике практически невозможно. В этом и заключается главный недостаток среднего FPS.
Средний FPS далеко не идеален, и при измерении производительности системы в играх ориентироваться только на него не стоит. 0.1% минимальный и 1% низкий FPS наоборот являются очень важными единицами измерения. Если говорить простым языком, то они показывают самые большие просадки FPS за время теста, портящие общее впечатление от игры.
Ещё раз о показателях игровой производительности — средние величины, процентили, 1% и 0.1% низкие FPS
реклама
В предыдущий раз мы познакомились с понятием времени кадра, а также с часто используемыми показателями игровой производительности, а именно, со средним, 1% и 0.1% низкими FPS, которые определённым образом характеризуют весь массив значений времени кадра на какой-либо игровой сцене. Необходимость использования указанных величин логических вытекает из двух простых, но важных утверждений:
Упрощённо, выброс (или промах) — это единичный результат измерений, сильно отличающийся от всех остальных результатов из всего массива данных. Выброс может быть обусловлен ошибкой измерений (устранимой или нет), а может просто отражать высокую вариативность значений измеряемой величины. И вся суть проблемы выбросов как раз и заключается в том, что мы, зачастую, не можем знать, какой из двух упомянутых вариантов имеет место быть. Так, например, в нашем случае аномально низкое значение величины минимального мгновенного 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). Интересующиеся могут ознакомиться с материалами по приведённым ссылкам, здесь же мы позволим себе лишь краткое резюме. С одной стороны, можно утверждать, что точно (в смысле правильно) измерить время кадра, т.е. разницу во времени между двумя реально выведенными на экран друг за другом кадрами, возможно только с помощью программно-аппаратных решений. С другой стороны, программно-аппаратные решения:
По поводу последнего утверждения, необходимо пояснить, что несмотря на то, что программная методика не является 100% точной в смысле истинности получаемых абсолютных значений времени кадра, она хорошо показывает себя для целей выяснения относительной производительности компьютерных систем, которая обычно и интересна. На этом, в принципе, можно было закрыть тему обсуждения программного метода измерения времени кадра, если бы не ещё один важный нюанс.
Время кадра: rendered vs. displayed
Рендеринг кадра — процесс технически сложный, включающий множество этапов, оформленных в конвейер. Вот, например, упрощенная блок-схема графического конвейера, взятая из руководства пользователя NVIDIA FrameView — одной из утилит мониторинга, основанной на PresentMon.
Упрощённо работу графического конвейера можно описать следующим образом:
Собственно, самым главным недостатком большей части чисто программных методов определения времени кадра (например, 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, так что ему нельзя верить даже с точностью до целых. Фактически здесь приходится выбирать — либо максимальный охват актуальных игровых проектов при невысокой прецизионности результатов, либо высокая прецизионность результатов, но полученная лишь для небольшого числа проектов со встроенным бенчмарком. Можно сказать, что мы здесь выбираем что в первую очередь тестируем — игры или «железо»? Мне интересно тестирование именно «железа», так что хотелось бы иметь хорошо воспроизводимые результаты, в которых не приходилось бы сомневаться даже при сравнительно небольшом числе тестовых прогонов. Так что мой выбор пал на игры со встроенным бенчмарком. Кроме того, прогоны встроенного бенчмарка практически всегда возможно автоматизировать, что значительно снижает трудозатраты на тестирование.
Конечно, в теории всегда можно попытаться автоматизировать передвижение персонажа по игровому миру, так чтобы получить хорошо воспроизводимую последовательность кадров даже в играх без встроенного бенчмарка. Но это в теории, а на практике, реализовать это технически сложно, так что даже если не помешает античит или крупное обновление, которое сломает необходимые файлы сохранений или удалить используемую для тестов локацию, трудозатраты слишком велики. Каждый, как мне кажется, должен заниматься своим делом — написать встроенный бенчмарк разработчикам игры в разы проще, чем сторонним тестировщикам производительности. При том, что такой бенчмарк для внутреннего использования безусловно пишется почти в любом случае, а понять мотивы, побуждающие не делать его доступным для простых смертных крайне трудно.
В любом случае, пока, резюмируя: