Почему нам мало 30 fps?
или
Почему в фильмах нам почти достаточно 24 кадров в секунду, а в игрушках хочется больше

24.11.2000


  Эта статья представляет собой итог собственных исследований и обсуждения подобной темы в различных конференциях. Особо хочу поблагодарить участников iXBT Hardware BBS, за высказанные мысли и идеи, наиболее яркие из которых изложены в этой статье.

  Известно, что изображение некоторого объекта, воспринимаемое мозгом с сетчатки глаза, не пропадает вместе с исчезнувшим объектом, а угасает в течение некоторого времени. Это свойство называют инерционностью сетчатки глаза. Из этого свойства исходит идея кино, где изображение состоит из меняющихся друг за другом кадров, которые начинают сливаться друг с другом на скорости показа большей, либо равной 24* кадрам в секунду. Возникает естественный вопрос, почему для фильмов достаточно 24 кадров в секунду, а в игрушках этого совсем не достаточно.

  Для начала, давайте определимся, в каких именно играх нам мало 30 fps. Ясно, что это должна быть игра, в которой моделируется некоторая ситуация в режиме реального времени (realtime). Этим мы сразу отбрасываем разнообразные компьютерные шахматы, квесты и большинство стратегических игрушек. В общем, исключаем «медленные» игры, где каждая новая итерация в игровом сюжете либо происходит нечасто, либо запускается по желанию игрока.

  Оставшиеся игры я назову динамическими играми, чтобы подчеркнуть непрерывность развития сюжета. Обычно, в такой игре мы управляем каким-либо главным героем. Это может быть или Лара Крофт из сами знаете откуда, или Porsche из NeedForSpeed. Пол или объем двигателя нашего героя абсолютно не важен, важно то, что в такой игре ситуация обновляется постоянно, что бы достичь впечатления реальности происходящего. Мы наблюдаем происходящее и, управляя своим персонажем, вносим изменения в игровую ситуацию, новое состояние которой, рассчитывается и выводится на экране. Таким образом, получается замкнутая цепь: компьютер рассчитывает картинку, мы ее видим, вносим изменения, используя устройства ввода, компьютер учитывает эти изменения, соответствующим образом меняет ситуацию и вновь отображает ее на экране.

  Меняя ситуацию, мы ожидаем немедленного отображения результатов на экране. Но ввод данных, расчет ситуации и картинки, а так же вывод картинки на экран добавляют дополнительные задержки к времени обработки, и поэтому, новая картинка возникает через некоторый промежуток времени, который назовем временем кадра. Обратная времени кадра величина характеризует частоту кадров в секунду (fps). Чем меньше будет время кадра, тем легче будет управлять героем в сложных ситуациях, когда требуется немедленная реакция на какое-то событие. На собственном опыте могу сказать, что для игр-симуляторов различных гонок 30 fps будет почти всегда достаточно, но вот для игр жанра action (а-ля Quake) эта величина будет просто губительна, особенно в жестком deathmatch. Этим игра и отличается от кино: в игре мы сами принимаем участие, а в кино мы являемся наблюдателем. Игра, по сравнению с фильмом, заставляет нас активно действовать и принимать решения. Просмотр фильма, в данном случае, является более пассивным процессом.

  Так как происходит моделирование реального процесса, то, чем меньше будет время кадра, тем больше состояний процесса, или, иначе говоря, больше fps будет рассчитано за один и тот же промежуток времени, по сравнению с большим временем кадра. Поясню на примере, используя немного математики, которую пришлось упростить для показательности:

допустим,через весь экран пролетает лошадь. Куда она летит, мы не знаем, но она проделывает это за одну секунду. Если время кадра равно 125 миллисекундам (мс), то мы сможем увидеть 8 кадров летящей лошади (1 сек = 1000 мс, 1000/125 = 8), где в каждом изображение лошади смещено относительно своего предыдущего изображения на 1/8 ширины экрана. Уменьшим время кадра, пусть оно будет равно 10 мс. Количество кадров повысится до 100, а расстояние между соседними лошадьми, точнее смещение, будет равно 1/100 ширины экрана. Естественно, что во втором случае кажущаяся «плавность» полета лошади будет больше.

    На основе этого примера рассмотрим три ситуации:

    1)    наблюдение реальной лошади
    2)    лошадь, заснятая на кинопленку
    3)    полет лошади, рассчитанный компьютером.


    В первом случае все достаточно просто: мы видим летящую лошадь.

Почему нам мало 30 fps? pic#1

  Во втором случае, за одну секунду съемок летящей лошади, мы получим 24 кадра со смазанной, в направлении движения, лошадью. Величина размытости будет соответствовать расстоянию, которое пролетела лошадь за 1/24 секунды.

  При показе, кадры, сливаясь, будут формировать изображение летящей лошади. Благодаря тому, что на каждом кадре изображение размыто,

Почему нам мало 30 fps? pic#2

будет создаваться довольно реалистичная картина:

Почему нам мало 30 fps? pic#3

  В третьем случае, мы имеем 24 кадра с четким изображением. Логика подсказывает следующие выводы: последовательный показ подобных кадров так же создаст иллюзию движения, однако реалистичность этого движения будет ниже, чем в предыдущем случае, т.к. сливаясь, кадры все равно будут оставлять на сетчатке глаза четкие изображения. Однако, как показывает опыт, мозг умудряется даже при таких исходных условиях воспринимать картинку достаточно хорошо. Картинка получается менее реалистичной, по сравнению с предыдущим случаем, но все-таки воспринимаемой.

Почему нам мало 30 fps? pic#4

  Представим теперь, что в процессе создания картинки, мы можем размыть изображение движущегося объекта в направлении движения на каждом из кадров, тогда мы получим аналогичную, второму случаю, ситуацию, что может значительно улучшить наблюдаемую картину. Такая возможность, теоретически, присутствует в чипах последней серии Voodoo от фирмы 3dfx. Благодаря технологии T-buffer, программист может реализовать некоторые видео эффекты, в том числе получить изображение, размытое в направлении движения (Motion blur). Однако, по множеству причин, эта технология, поддержки у разработчиков игр, не получила.

  Хочу отметить еще один факт: человек способен лучше замечать не свойства окружающей среды, а изменение этих свойств, то есть динамику процесса. Это является особенностью любой сложной биологической системы, кем мы с вами и являемся. Применимо это утверждение и к зрению. Скачки fps оказываются хуже, чем постоянный низкий fps. При игре с неровным fps, мозг не успевает адаптироваться к определенному его значению, когда уже возникает новое, что приводит к ухудшению восприятия. Поэтому мы и замечаем момент, когда скорость в игре падает с 90 fps до 40, хотя, казалось бы, оба числа больше тех 24 кадров в фильме, которые для нас неразличимы.

  Проведите следующий небольшой тест, как это сделал я. Путем описанных ниже манипуляций, я получил постоянные, стабильные 30fps в игре Quake3. Для этого я выставил частоту кадров вертикальной развертки на 60, включил синхронизацию вывода нового кадра с частотой развертки (V-Sync) и написал в консоли com_maxfps 30. То есть, один и тот же игровой кадр прорисовывался на мониторе два раза подряд. Тут же был замечен отличительный недостаток: движущийся объект становится раздвоенным, явно видно текущий и предыдущий (или последующий) кадр. Кстати, этот артефакт возникает на всех приложениях при таких же условиях (кадровая на 60, fps равен 30), так что, это не может быть особенностью графического движка Quake3. Я уверен, что если бы можно было выставить частоту вертикальной развертки на 30 кадров, уравняв, таким образом, частоту расчета кадров (fps) и частоту обновления экрана, то раздвоение исчезло бы, однако, в таком случае, возникнут несколько гораздо худших недостатков.

  Во-первых, настолько низкая частота обновления экрана, сама по себе, вредна для глаз.
  Во-вторых, это возникновение лага - явления, когда управление, например, движение мышью, отражается на экране с определенной задержкой, независящей от fps. Лаг значительно усложняет процесс игры, а если он еще и меняется во времени, то это делает игру просто невозможной.
  В третьих, не стоит забывать, что fps - это не только частота показа новых кадров, но и частота расчета физической модели движения объектов на игровой сцене. Чем чаще эта модель будет обновляться, тем больше она будет похожа на реальную. Вот хороший пример: рассчитывается последовательность кадров, в которой мячик падает на пол, и затем отскакивает наверх. Если убрать кадр, в котором мячик коснулся пола, то получиться, что мячик отскочил от невидимого препятствия над полом. Аналогичная ситуация возникает, когда в текущем кадре мячик еще падает, этот кадр рассчитывается и выводится на экран, затем начинается расчет следующего кадра и оказывается, что за это время реальный мячик уже отскочил бы вверх, и рисовать его необходимо снова над полом, пропустив, таким образом, ключевой момент, где происходит касание мячиком пола.

  Типичным примером подобной «неправильной» физики является Quake3. Опытным путем было выявлено, что запрыгивать на ступени определенной высоты возможно, только получив на экране определенный fps. Значений этих fps может быть несколько. Объясняется это тем, что только при определенном значении fps момент расчета нового кадра и наивысшая (или близкая к наивысшей) точка прыжка совпадают, что и дает возможность запрыгнуть. При любых других значениях fps, никакой кадр не попадает на наивысшую точку прыжка. Разумеется, чем чаще мы будем пересчитывать физическую модель, тем ближе она будет к реальности, тем вероятнее, что один из кадров попадет на наивысшую точку прыжка.

Подведем итог:

    30 fps не может быть достаточно по следующим причинам:

  • в игре мы сами принимаем участие, а в кино мы являемся наблюдателем. Для игры, чем больше fps, тем легче быстро среагировать на внезапную игровую ситуацию. 30 fps, для некоторых игр, совершенно недостаточно;

  • если в фильме идет 24 кадра в секунду через одинаковые промежутки времени, то в игре, текущее значение fps зависит от сложности наблюдаемой сцены и многих других параметров. Чем ближе друг к другу будут значения минимального и максимального fps, тем лучше, однако если fps ниже частоты обновления экрана, то будет наблюдаться эффект «раздвоения» движущихся относительно наблюдателя объектов, что ухудшает восприятие. Приблизится к совершенной плавности можно, добившись от игры постоянного значения fps и установив на такое же значение частоту обновления экрана, но если частота обновления экрана низкая, это будет вредно для глаз;

  • чем больше fps, тем больше рассчитываемая физическая модель движения будет похожа на реальную.

  Кстати, из последнего пункта следует, что добиваться fps большего, чем частота бновления экрана, не такое уж бессмысленное занятие. Физическая модель движения будет точнее, разумеется, если выключена синхронизация с частотой обновления экрана.



* это значение является общепринятым. Однако я нашел информацию (Мир ПК · # 3/97 · стр. 156-160) о методике диагностики патологических процессов в зрительной системе, в которой, для определения степени утомления глаз, применяется метод исследования критической частоты слияния световых мельканий - КЧСМ-диагностика. Методика основана на инерционности сетчатки глаза и определяет граничную частоту световых пульсаций, когда человек уже не различает вспышек, а видит равномерное свечение. В среднем, эта частота колеблется между 45-55 Гц. Подробнее можно прочесть в самом журнале.



Кондратюк Александр a.k.a. render (render@i.am)