что такое framerate в играх
Фреймрейт
Понятие обычно используется применительно к скорости обработки графики, либо к параметрам видео записи.
При фреймрейте превосходящим 24 кадра в секунду создается иллюзия движения, и человек уже не воспринимает отдельные границы кадров (см. 25 кадр), хотя при увеличении количества кадров реалистичность восприятия увеличивается.
Содержание
Области применения понятия
Близкие понятия
Понятие фреймрейт более узкое, нежели кадровая частота, так как первое не используется когда речь идет о частотах обновления экрана (англ. refresh rate ).
Обработка графики и видео
При обработке графики фреймрейт может динамически изменяться в зависимости от производительности системы и сложности обработки конкретного кадра.
В графических приложениях реального времени, особенно в интерактивных (в том числе в играх) фреймрейт является одной из характеристик, влияющих на комфортность их использования: при недостаточном фреймрейте может пропадать ощущение плавности движения, или становиться заметной задержка управления. Здесь можно еще раз отметить отличие от частоты обновления экрана, при недостаточной величине которой в первую очередь будет ощущаться физический дискомфорт (усталость глаз).
Также, фреймрейт используется как характеристика скорости кодирования видео (имеется в виду число кадров сжатых за единицу времени).
Являясь одновременно параметром, важным для конечного пользователя и характеризующим производительность системы при работе с графикой и видео, понятие фреймрейт часто встречается в сравнительных тестах компьютерных комплектующих.
Характеристика видеоматериала
Фреймрейт видео — непосредственное количество кадров в хранимом или воспроизводимом видеоматериале за единицу времени. Кроме совсем экзотических случаев, фреймрейт на протяжении всего видеофрагмента постоянен. Применимо к чересстрочной развертке, где может возникнуть путаница что называть фреймрейтом — количество кадров или полукадров за единицу времени, обычно используется первое. Таким образом фиксированный фреймрейт передачи в привычных форматах PAL/SECAM — 25fps, рассчитанный на отображение с частотой 50Гц.
На данный момент существуют алгоритмы интерполяции кадров для повышения фреймрейта материала до частоты обновления экрана (или половины частоты обновления для чересстрочной развертки).
За последние годы можно наблюдать всё растущее понимание, что одного только среднего 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, что периодически порождает путаницу и неразбериху.
Иллюзия движения
История о чувстве зрения, восприятии кадров и частоты обновления, размытости движущегося объекта и телевизионных экранах.
(также см. перевод статьи того же автора «Иллюзия скорости» — прим. пер.)
Введение
Вы могли слышать термин кадры в секунду (FPS), и что 60 FPS — действительно хороший ориентир для любой анимации. Но большинство консольных игр идут на 30 FPS, а кинофильмы обычно записывают на 24 FPS, так зачем же нам стремиться к 60 FPS?
Кадры… в секунду?
Ранние времена кинопроизводства
Съёмки голливудского фильма 1950 года «Юлий Цезарь» с Чарлтоном Хестоном
Когда первые кинематографисты начали снимать кино, многие открытия делались не научным методом, а путём проб и ошибок. Первые камеры и проекторы управлялись вручную, а плёнка была очень дорогой — настолько дорогой, что при съёмке старались использовать наименьшую возможную частоту кадров, лишь бы сэкономить плёнку. Этот порог обычно находился между 16 и 24 FPS.
Когда на физическую плёнку наложили звук (аудиотрек) и воспроизводили его одновременно с видео, то управляемое вручную воспроизведение стало проблемой. Выяснилось, что люди нормально воспринимают переменный фреймрейт для видео, но не для звука (когда изменяется и темп, и высота тона), так что кинематографистам пришлось выбрать постоянную скорость для того и другого. Выбрали 24 FPS, и сейчас, спустя почти сто лет, он остаётся стандартом в кино. (В телевидении частоту кадров пришлось слегка изменить из-за того, как ЭЛТ-телевизоры синхронизируются с частотой электросети).
Кадры и человеческий глаз
Но если 24 FPS еле приемлем для кино, то какой оптимальный фреймрейт? Это хитрый вопрос, потому что оптимальной частоты кадров нет.
Восприятие движения — это процесс выведения скорости и направления элементов сцены на основании зрительных, вестибулярных и проприоцептивных ощущений. Хотя процесс кажется простым для большинства наблюдателей, он оказался сложной проблемой с вычислительной точки зрения и чрезвычайно трудно объяснимым с точки зрения нейронной обработки. — Википедия
Глаз — это не камера. Он не воспринимает движение как серию кадров. Он воспринимает непрерывный поток информации, а не набор отдельных картинок. Почему тогда кадры вообще работают?
Два важных феномена объясняют, почему мы видим движение, когда смотрим на быстро сменяющиеся картинки: инерция зрительного восприятия и фи-феномен (стробоскопическая иллюзия непрерывного движения — прим. пер.).
Большинство кинематографистов думают, что единственной причиной является инерция зрительного восприятия, но это не так; хотя и подтверждённая, но не доказанная с научной точки зрения инерция зрительного восприятия является феноменом, согласно которому остаточное изображение, вероятно, сохраняется примерно 40 миллисекунд на сетчатке глаза. Это объясняет, почему мы не видим тёмное мерцание в кинотеатрах или (обычно) на ЭЛТ.
Фи-феномен в действии. Заметили движение на картинке, хотя на ней ничего не двигается?
С другой стороны, многие считают именно фи-феномен истинной причиной того, что нам видится движение за отдельными изображениями. Это оптическая иллюзия восприятия непрерывного движения между отдельными объектами, если их быстро показывают одно за другим. Но даже фи-феномен подвергается сомнению, и учёные не пришли к единому мнению.
Наш мозг очень хорошо помогает подделывать движение — не идеально, но достаточно хорошо. Серия неподвижных кадров, имитирующих движение, создаёт разные перцептивные артефакты в мозге, в зависимости от частоты кадров. Таким образом, частота кадров никогда не будет оптимальной, но мы можем приблизиться к идеалу.
Стандартные фреймрейты, от плохих к идеальным
Чтобы лучше понять абсолютную шкалу качества фреймрейта, предлагаю посмотреть обзорную таблицу. Но помните, что глаз — сложная система и он не распознаёт отдельные кадры, так что это не точная наука, а просто наблюдения разных людей за прошедшее время.
Фреймрейт | Восприятие человеком |
---|---|
10-12 FPS | Абсолютный минимум для демонстрации движения. Меньшие значения уже распознаются глазом как отдельные изображения. |
Изображения от Evans & Sutherland Computer Corporation, Солт-Лейк-Сити, Юта. Используются с разрешения. All rights reserved. |
Motion blur использует хитрость, изображая много движения в одном кадре, жертвуя детализацией. Вот причина, почему кинофильм на 24 FPS выглядит относительно приемлемо, по сравнению с видеоиграми на 24 FPS.
Но как изначально появляется motion blur? Согласно описанию E&S, которая впервые применила 60 FPS для своих мега-купольных экранов:
Когда вы снимаете фильм на 24 FPS, камера видит и записывает только часть движения перед объективом, а затвор закрывается после каждой выдержки, чтобы перемотать плёнку к следующему кадру. Это значит, что выдержка закрыта в течение такого же времени, что и открыта. При быстром движении и действии перед камерой частота кадров недостаточно высока, чтобы успеть за ними, а изображения размываются в каждом кадре (из-за времени экспозиции).
Вот графика, упрощённо объясняющая процесс.
Изображения Hugo Elias. Используются с разрешения.
Классические кинокамеры используют обтюратор (вращающийся секционированный диск — прим. пер.) для захвата motion blur. Вращая диск, вы открываете затвор на контролируемый промежуток времени под определённом углом и, в зависимости от этого угла, изменяете время экспозиции. Если выдержка маленькая, то на плёнку запишется меньше движения, то есть motion blur будет слабее; а если выдержка большая, то запишется больше движения и эффект проявится сильнее.
Обтюратор в действии. Via Википедия
Если motion blur — такая полезная вещь, то почему кинематографисты стремятся от него избавиться? Ну, при добавлении motion blur вы теряете детализацию; а избавившись от него — теряете плавность движений. Так что когда режиссёры хотят снять сцену с большим количеством деталей, вроде взрыва с большим количеством вылетающих частиц или сложной сцены с действием, они часто выбирают маленькую выдержку, которая уменьшает размытие и создаёт чёткий эффект кукольной мультипликации.
Визуализация захвата Motion Blur. Via Википедия
Так почему бы его просто не добавить?
Motion blur значительно улучшает анимацию в играх и на веб-сайтах даже на низких фреймрейтах. К сожалению, его внедрение слишком дорого обходится. Для создания идеального motion blur вам понадобилось бы снять в четыре раза больше кадров объекта в движении, а затем осуществить временнýю фильтрацию или сглаживание (вот отличное объяснение от Хьюго Элиаша). Если для выпуска приемлемого материала на 24 FPS вам нужно делать рендеринг на 96 FPS, то вместо этого вы можете просто поднять фреймрейт, так что зачастую это не вариант для контента, который рендерится в реальном времени. Исключениями являются видеоигры, где заранее известна траектория движения объектов, так что можно рассчитать приблизительный motion blur, а также системы декларативной анимации вроде CSS Animations и, конечно, CGI-фильмы как у Pixar.
Примечание: герц (Гц) обычно используется, когда говорят о частоте обновления, в то время как показатель кадров в секунду (fps) — устоявшийся термин для покадровой анимации. Чтобы не путать их, мы используем Гц для частоты обновления и FPS для фреймрейта.
Если вы задаётесь вопросом, почему на вашем ноутбуке так некрасиво выглядит воспроизведение дисков Blu-Ray, то часто причина в том, что фреймрейт неравномерно делится на частоту обновления экрана (в противоположность им, DVD конвертируются перед передачей). Да, частота обновления и фреймрейт — не одно и то же. Согласно Википедии, «[..] частота обновления включает в себя повторное рисование идентичных кадров, тогда как фреймрейт измеряет, как часто исходный видеоматериал будет выдавать полный кадр новых данных на дисплей». Так что фреймрейт соответствует количеству отдельных кадров на экране, а частота обновления соответствует числу раз, когда изображение на экране обновляется или перерисовывается.
В идеальном случае частота обновления и фреймрейт полностью синхронизированы, но в определённых ситуациях есть причины использовать частоту обновления в три раза выше фреймрейта, в зависимости от используемой проекционной системы.
Новая проблема у каждого дисплея
Кинопроекторы
Многие думают, что во время работы кинопроекторы прокручивают плёнку перед источником света. Но в таком случае мы бы наблюдали непрерывное размытое изображение. Вместо этого для отделения кадров друг от друга здесь используется затвор, как и в случае с кинокамерами. После отображения кадра затвор закрывается и свет не проходит до тех пор, пока затвор не откроется для следующего кадра, и процесс повторяется.
Затвор кинопроектора в действии. Из Википедии.
Однако это не полное описание. Конечно, в результате такого процессы вы увидите-таки фильм, но мерцание экрана из-за того, что экран остаётся тёмным 50% времени, сведёт вас с ума. Эти затемнения между кадрами разрушат иллюзию. Для компенсации проекторы на самом деле закрывают затвор два или три раза на каждом кадре.
Конечно, это кажется нелогичным — почему в результате добавления дополнительных мерцаний нам кажется, что их стало меньше? Задача в том, чтобы уменьшить период затемнения, который оказывает непропорциональный эффект на зрительную систему. Порог слияния мерцания (тесно связанный с инерцией зрительного восприятия) описывает эффект от этих затемнений. Примерно на
45 Гц периоды затемнения должны составлять менее
60% времени показа кадра, вот почему эффективен метод двойного срабатывания затвора в кино. Более чем на 60 Гц периоды затемнения могут составлять более 90% времени показа кадра (необходимо для дисплеев вроде ЭЛТ). Вся концепция в целом немного сложнее, но на практике вот как можно избежать мерцания:
Мониторы и телевизоры ЭЛТ работают, направляя электроны на флуоресцентный экран, где содержится люминофор с низким временем послесвечения. Насколько мало время послесвечения? Настолько мало, что вы никогда не увидите полное изображение! Вместо этого в процессе электронного сканирования люминофор зажигается и теряет свою яркость менее чем за 50 микросекунд — это 0,05 миллискунды! Для сравнения, полный кадр на вашем смартфоне демонстрируется в течение 16,67 мс.
Обновление экрана, снятое с выдержкой 1/3000 секунды. Из Википедии.
Так что единственная причина, почему ЭЛТ вообще работает — это инерция зрительного восприятия. Из-за длительных тёмных промежутков между подсветками ЭЛТ часто кажутся мерцающими — особенно в системе PAL, которая работает на 50 Гц, в отличие от NTSC, работающей на 60 Гц, где уже вступает в действие порог слияния мерцания.
Чтобы ещё более усложнить дело, глаз не воспринимает мерцание одинаково на каждом участке экрана. На самом деле периферийное зрение, хотя и передаёт в мозг более размытое изображение, более чувствительно к яркости и обладает значительно меньшим временем отклика. Вероятно, это было очень полезно в древние времена для обнаружения диких животных, прыгающих сбоку, чтобы вас съесть, но это доставляет неудобства при просмотре фильмов по ЭЛТ с близкого расстояния или под странным углом.
Жидкокристаллические дисплеи (LCD), которые классифицируются как устройства выборки и хранения, на самом деле довольно удивительные, потому что у них вообще нет затемнений между кадрами. Текущее изображение непрерывно демонстрируется на нём, пока не поступит новое изображение.
Позвольте повторить: На ЖК-дисплеях нет мерцания, вызванного обновлением экрана, независимо от частоты обновления.
Но теперь вы думаете: «Погодите, я недавно выбирал телевизор, и каждый производитель рекламировал, чёрт побери, более высокую частоту обновления экрана!» И хотя в основном это чистый маркетинг, но ЖК-дисплеи с более высокой частотой обновления решают проблему — просто не ту, о которой вы думаете.
Зрительное размытие в движении
Производители ЖК-дисплеев всё повышают и повышают частоту обновления из-за экранного или зрительного motion blur. Так и есть; не только камера способна записывать размытие в движении, но ваши глаза тоже могут! Прежде чем объяснить, как это происходит, вот две сносящие крышу демки, которые помогут вам почувствовать эффект (нажмите на изображение).
В первом эксперименте сфокусируйте взгляд на неподвижном летающем инопланетянине вверху — и вы будете чётко видеть белые линии. А если сфокусировать взгляд на движущемся инопланетянине, то белые линии волшебным образом исчезают. С сайта Blur Busters:
«Из-за движения ваших глаз вертикальные линии при каждом обновлении кадра размываются в более толстые линии, заполняя чёрные пустоты. Дисплеи с малым послесвечием (такие как ЭЛТ или LightBoost) устраняют подобный motion blur, так что этот тест выглядит иначе на таких дисплеях».
На самом деле эффект отслеживания взглядом различных объектов никогда невозможно полностью предотвратить, и часто он является такой большой проблемой в кинематографе и продакшне, что есть специальные люди, чья единственная работа — предсказывать, что именно будет отслеживать взгляд зрителя в кадре, и гарантировать, что ничто другое ему не помешает.
Во втором эксперименте ребята из Blur Busters пытаются воссоздать эффект ЖК-дисплея по сравнению с экраном с малым послесвечием, просто вставляя чёрные кадры между кадрами дисплея — удивительно, но это работает.
Как показано ранее, motion blur может стать либо благословением, либо проклятием — он жертвует резкостью ради плавности, а добавляемое вашими глазами размытие всегда нежелательно. Так почему же motion blur — настолько большая проблема для ЖК-дисплеев по сравнению с ЭЛТ, где подобных вопросов не возникает? Вот объяснение того, что происходит, если краткосрочный кадр (полученный за короткое время) задерживается на экране дольше, чем ожидалось.
Следующая цитата — из отличной статьи Дейва Марша на MSDN о временнóй передискретизации. Она удивительно точна и актуальна для статьи 15-летней давности:
При адресации пикселя он загружается с определённым значением и остаётся с этим значением светового выхода до следующей адресации. С точки зрения рисования изображения это неправильно. Конкретный экземпляр оригинальной сцены действителен только в конкретное мгновение. После этого мгновения объекты сцены должны быть перемещены в другие места. Некорректно удерживать изображения объектов в неподвижных позициях, пока не придёт следующий образец. Иначе выходит, что объект как будто внезапно перепрыгивает в совершенно другое место.
Ваш взгляд будет пытаться плавно следовать за передвижениями интересующего объекта, а дисплей будет удерживать его в неподвижном состоянии весь кадр. Результатом неизбежно станет размытое изображение движущегося объекта.
Вот как! Получается, что нам нужно сделать — так это засветить изображение на сетчатку, а затем позволить глазу вместе с мозгом выполнить интерполяцию движения.
Дополнительно: так в какой степени наш мозг выполняет интерполяцию, на самом деле?
Никто не знает точно, но определённо есть много ситуаций, где мозг помогает создать финальное изображение того, что ему показывают. Взять хотя бы для примера этот тест на слепое пятно: оказывается, существует слепое пятно в том месте, где оптический нерв присоединяется к сетчатке. По идее, пятно должно быть чёрным, но на самом деле мозг заполняет его интерполированным изображением с окружающего пространства.
Кадры и обновления экрана не смешиваются и не совпадают!
Как было упомянуто ранее, существуют проблемы, если фреймрейт и частота обновления экрана не синхронизированы, то есть когда частота обновления не делится без остатка на фреймрейт.
Проблема: разрыв экрана
Что происходит, когда ваша игра или приложение начинают рисовать новый кадр на экране, а дисплей находится посередине цикла обновления? Это буквально разрывает кадр на части:
Вот что происходит за сценой. Ваш CPU/GPU выполняет определённые вычисления для составления кадра, затем передаёт его в буфер, который должен ждать, что монитор вызовет обновление через стек драйверов. Затем монитор считывает этот фрейм и начинает его отображать (здесь вам нужна двойная буферизация, чтобы всегда одно изображение отдавалось, а одно составлялось). Разрыв происходит, когда буфер, который в данный момент выводится на экран сверху вниз, заменяется следующим кадром, который выдаёт видеокарта. В результате получается, что верхняя часть вашего экрана получена из одного кадра, а нижняя часть — из другого.
Примечание: если быть точным, разрыв экрана может произойти, даже если частота обновления и фреймрейт совпадают! У них должна совпадать и фаза, и частота.
Разрыв экрана в действии. Из Википедии
Это явно не то, что нам нужно. К счастью, есть решение!
Решение: Vsync
Разрыв экрана можно устранить с помощью Vsync, сокращённо от «вертикальная синхронизация». Это аппаратная или программная функция, которая гарантирует, что разрыва не произойдёт — что ваше программное обеспечение может отрисовать новый кадр только тогда, когда закончено предыдущее обновление экрана. Vsync изменяет частоту изъятия кадров из буфера вышеупомянутого процесса, чтобы изображение никогда не изменялось посередине экрана.
Следовательно, если новый кадр ещё не готов для отрисовки на следующем обновлении экрана, то экран просто возьмёт предыдущий кадр и заново отрисует его. К сожалению, это ведёт к следующей проблеме.
Новая проблема: джиттер
Хотя наши кадры больше не разрываются, воспроизведение всё равно далеко не плавное. На этот раз причина в проблеме, которая настолько серьёзна, что каждая индустрия даёт ей свои названия: джаддер, джиттер, статтер, джанк или хитчинг, дрожание и сцепка. Давайте остановимся на термине «джиттер».
Джиттер происходит, когда анимация воспроизводитеся на другой частоте кадров по сравнению с той, на которой её снимали (или предполагали воспроизводить). Часто это означает, что джиттер появляется, когда частота воспроизведения нестабильная или переменная, а не фиксированная (поскольку бóльшая часть контента записывается с фиксированной частотой). К сожалению, именно это происходит при попытке отобразить, например, контент 24 FPS на экране, который обновляется 60 раз в секунду. Время от времени, поскольку 60 не делится на 24 без остатка, приходится один кадр показывать дважды (если не использовать более продвинутые преобразования), что портит плавные эффекты, такие как панорамирование камеры.
В играх и на веб-сайтах с большим количеством анимации это даже более заметно. Многие не могут воспроизводить анимацию на постоянном, делящемся без остатка фреймрейте. Вместо этого частота смены кадров у них сильно изменяется по разным причинам, таким как независимая друг от друга работа отдельных графических слоёв, обработка ввода пользовательских данных и так далее. Вас это может шокировать, но анимация с максимальной частотой 30 FPS выглядит гораздо, гораздо лучше, чем та же анимация с частотой, которая изменяется от 40 до 50 FPS.
Необязательно мне верить на слово; посмотрите своими глазами. Вот эффектная демонстрация микроджиттера (микростаттера).
Борьба с джиттером
При преобразовании: «телекинопроектор»
«Телекинопроектор» — метод преобразования изображения на киноплёнке в видеосигнал. Дорогие профессиональные конвертеры вроде тех, что используются на телевидении, осущестьвляют эту операцию в основном с помощью процесса, который называется управление вектором движения (motion vector steering). Он способен создавать очень убедительные новые кадры для заполнения промежутков. В то же время по-прежнему широко используются два других метода.
При преобразовании 24 FPS в сигнал PAL на 25 FPS (например, ТВ или видео в Великобритании) обычной практикой считается просто ускорить оригинальное видео на 1/25 секунды. Так что если вы когда-нибудь гадали, почему «Охотники за привидениями» в Европе на пару минут короче, то вот ответ. Хотя метод работает на удивление хорошо для видео, он ужасно отражается на звуке. Вы спросите, насколько хуже может быть ускоренный на 1/25 звук без дополнительного изменения высоты тона? Почти на полтона хуже.
Возьмём реальный пример крупного провала. Когда Warner выпустила в Германии расширенную Blu-Ray коллекцию «Властелина колец», они использовали для немецкого дубляжа уже скорректированную PAL-версию звуковой дорожки, которая была предварительно ускорена на 1/25 с последующим понижением тона для исправления изменений. Но поскольку Blu-Ray идёт на 24 FPS, им пришлось выполнять обратное преобразование видео, так что они снова его замедлили. Конечно, с самого начала плохой идеей было выполнять такое двойное преобразование, из-за потерь, но что ещё хуже, после замедления видео для соответствия частоте кадров Blu-Ray они забыли изменить обратно тон на звуковой дорожке, так что все актёры в фильме внезапно стали звучать сверхдепрессивно, разговаривая на полтона ниже. Да, это реальная история и да, она очень оскорбила фанатов, было много слёз, много плохих копий и много потерянных денег после большого отзыва дисков.
Мораль истории: изменение скорости — не самая лучшая идея.
Преобразовать киноматериал для NTSC, американского телевизионного стандарта, не получится простым ускорением, потому что преобразование 24 FPS в 29,97 FPS соответствует ускорению на 24,875%. Если только вы по-настоящему не любите бурундучков, это будет не лучшим вариантом.
Вместо этого используется процесс под названием 3:2 pulldown (среди прочих), который стал самым популярным методом преобразования. В рамках этого процесса берут 4 оригинальных кадра и преобразуют их в 10 чересстрочных полукадров или 5 полных кадров. Вот иллюстрация, которая описывает процесс.
3:2 Pulldown в действии. Из Википедии.
На чересстрочном дисплее (то есть ЭЛТ) видеополя посредине отображаются в тандеме, каждый в чересстрочном варианте, поэтому они состоят из каждой второй строки пикселей. Оригинальный кадр A разбивается на два полукадра, оба из которых отображаются на экране. Следующий кадр B тоже разбивается, но нечётное видеополе отображается дважды, так что этот кадр распределяется по трём полукадрам. И, в сумме, мы получаем 10 распределённых по видеополям полукадров из 4 оригинальных полных кадров.
Это работает достаточно хорошо при показе на чересстрочном экране (таком как ЭЛТ-телевизор) примерно с 60 видеополями в секунду (практически полукадрами), поскольку полукадры никогда не показываются вместе. Но такой сигнал выглядит ужасно на дисплеях, которые не поддерживают полукадры и должны составить вместе 30 полных кадров, как в самом правом столбце на иллюстрации вверху. Причина провала в том, что каждый третий и четвёртый кадры слепляются из двух разных кадров оригинала, что приводит к тому, что я называю «Франкенфрейм». Это особенно ужасно выглядит на быстром движении, когда имеются значительные отличия между соседними кадрами.
Так что pulldown выглядит изящно, но это тоже не универсальное решение. Тогда что? Неужели нет идеального варианта? Как выясняется, он таки есть, и решение обманчиво простое!
При показе: G-Sync, Freesync и ограничение максимальной частоты кадров
Вместо того, чтобы бороться с фиксированной частотой обновления, конечно, гораздо лучше использовать переменную частоту обновления, которая всегда синхронизирована с фреймрейтом. Это именно то, для чего предназначены технологии Nvidia G-Sync и AMD Freesync. G-Sync — модуль, встроенный в мониторы, он позволяет им синхронизироваться с выдачей GPU вместо того чтобы заставлять GPU синхронизироваться с монитором, а Freesync достигает той же цели без модуля. Это действительно революционные технологии, которые устраняют необходимость в «телекинопроекторе», а весь контент с переменным фреймрейтом, вроде игр и веб-анимаций, выглядит намного более плавным.
К сожалению, и G-Sync, и Freesync — относительно новые технологии и ещё недостаточно широко распространились, так что если вы как веб-разработчик делаете анимации для веб-сайтов или приложений и не можете себе позволить использовать полноценные 60 FPS, то лучше всего будет ограничить максимальный фреймрейт, чтобы он без остатка делился на частоту обновления — практически во всех случаях наилучшим ограничением будет 30 FPS.
Заключение и последующие действия
Так как достичь пристойного баланса с учётом всех желаемых эффектов — минимального размытия в движении, минимального мерцания, постоянной частоты кадров, хорошего отображения движения и хорошей совместимости со всеми дисплеями — без особого обременения GPU и дисплея? Да, сверхбольшие фреймрейты могут снизить размытие в движении, но большой ценой. Ответ ясен и после чтения этой статьи вы должны его знать: 60 FPS.
Теперь, когда вы умнее, приложите все усилия, чтобы запустить весь анимированный контент со скоростью 60 кадров в секунду.
a) Если вы веб-разработчик
Сходите на jankfree.org, где разработчики Chrome собирают лучшие ресурсы о том, как сделать все ваши приложения и анимации безупречно плавными. Если у вас есть время только для одной статьи, то выберите отличную статью Пола Льюиса The Runtime Performance Checklist.
b) Если вы Android-разработчик
Сверьтесь с нашими «Лучшими практиками для производительности» в официальном разделе Android Training, где мы собрали для вас список самых важных факторов, узких мест и хитростей оптимизации.
c) Если вы работаете в киноиндустрии
Записывайте весь контент на 60 FPS или, ещё лучше, на 120 FPS, чтобы можно было свести его к 60 FPS, 30 FPS и 24 FPS в случае необходимости (к сожалению, для добавления поддержки 50 FPS и 25 FPS (PAL) придётся поднять частоту кадров до 600 FPS). Воспроизводите весь контент на 60 FPS и не извиняйтесь за «эффект мыльной оперы». Эта революция потребует времени, но она случится.
d) Для всех остальных
Требуйте 60 FPS для любых движущихся картинок на экране, а если кто спросит почему, отправьте его к этой статье.