Содержание
- Игровые циклы или ЭлектроКардиоГама
- Ограничение FPS: как и зачем? Тринитарная формула фпс лимитеров.
- Зачем Опытные Игроки Ограничивают FPS ?
- Кадры в секунду и частота монитора: как они связаны?
- Fps игры что это
- Что такое фпс? Зачем нужен в играх? | Все о фпс

Слабое железо может иногда породить задержки в местах, где игра становится «тяжеловата». Это определенно будет иметь место в 3D играх, когда слишком много полигонов отрисовывается. В результате провал в FPS приведет к замедлению обработки пользовательского ввода. Обновление игры будет реагировать на провалы FPS, в результате состояние игры будет изменяться с заметными лагами. В результате время реакции игрока, ровно как и ИИ, замедлится, что может сделать даже простой маневр невозможным. К примеру, препятствие, которое можно преодолеть при нормальном FPS, будет невозможно преодолеть при низком FPS. Еще более серьезные проблемы на слабом железе будут при использовании физики. Симуляция физики может «взорваться».
Игровые циклы или ЭлектроКардиоГама
Игровой цикл — это пульс каждой игры. Ни одна игра не будет работать без этого. Однако, к несчастью каждого нового разработчика игр, в сети нет хороших статей, в которых уделено достаточное внимание этой теме. Но не печальтесь, потому как только что вы получили возможность прочитать единственную в своем роде статью, уделяющую вопросу игровых циклов заслуженное внимание. По долгу службы мне часто приходится иметь дело с большим количеством кода мелких мобильных игр. И я каждый раз удивляюсь сколь много существует реализаций игрового цикла. Вы тоже можете удивиться как можно для такой, казалось бы простой, вещи можно придумать множество имплементаций. А ведь можно! И в статье я постараюсь рассказать о достоинствах и недостатках наиболее популярных вариантов игровых циклов. Также я постараюсь описать наилучший на мой взгляд вариант реализации игрового цикла.
(Thanks to Kao Cardoso Félix this article is also available in Brazilian Portuguese) (Thanks for me, in Russian also, прим. перев.)
Игровой цикл
Каждая игра содержит последовательность вызовов чтения пользовательского ввода, обновления состояния игры, обработки ИИ, проигрывания музыки и звуковых эффектов, отрисовки графики. Эта последовательность вызовов выполняется внутри игрового цикла. Т.е., как и было сказано в тизере, игровой цикл — это пульс каждой игры. В статье я не буду углубляться в детали реализации упомянутых выше тасков, а сконцентрируюсь исключительно на проблеме игрового цикла. По той же причине я упрощу список тасков до двух функций: обновление состояния и отрисовка. Ниже представлен пример кода для наиболее простой реализации игрового цикла.
bool game_is_running = true; while( game_is_running )
Проблема этой реализации в том, что она не обрабатывает время. Игра просто выполняется. На слабом железе игра работает медленно, на сильном — быстро. Давным давно, когда производительность компьютера была известной и примерно одинаковой на разных машинах, такая реализация не рождала проблем. Сегодня же, когда существует множество платформ с разной производительностью, появилась необходимость в обработке времени. Сделать это можно разными путями. О них я расскажу позже. А пока позвольте мне разъяснить пару моментов, которые дальше будут использоваться.
FPS
FPS — это аббревиатура от «Frames Per Second» (Кадров В Секунду, прим. перев.). В контексте представленной выше реализации игрового цикла это количество вызовов display_game() за одну секунду.
Скорость игры
Скорость игры — это количество обновлений состояния игры за одну секунду. Иными словами, количество вызовов update_game() в секунду времени.
FPS, зависящий от постоянной скорости игры
Реализация
Самое простое решение проблемы тайминга — просто выполнять вызовы с фиксированной частотой 25 раз/сек. Код, реализующий этот подход ниже.
const int FRAMES_PER_SECOND = 25; const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND; DWORD next_game_tick = GetTickCount(); // GetTickCount() returns the current number of milliseconds // that have elapsed since the system was started int sleep_time = 0; bool game_is_running = true; while( game_is_running ) < update_game(); display_game(); next_game_tick += SKIP_TICKS; sleep_time = next_game_tick - GetTickCount(); if( sleep_time >= 0 ) < Sleep( sleep_time ); >else < // Shit, we are running behind! >>
Это реализация с одним большим плюсом: ПРОСТОТА! Коль скоро вы знаете, что update_game() вызывается 25 раз в секунду, написание остального кода становится проще пареной репы. К примеру, реализация функционала реплея становится тривиальной задачей. Если в игре не используются случайные величины, то вы просто можете логгировать пользовательский ввод и воспроизводить его позже. На своей тестовой машине вы можете подобрать некое компромиссное значение для FRAMES_PER_SECOND, но что произойдет на более быстром или более медленном железе? Давайте выясним это.
Слабое железо
Если железо способно выдерживать заданное FPS, то проблемы нет. Проблемы появятся, когда машина не сможет держать FPS на заданном уровне. Игра будет работать медленнее. В худшем случае игра будет лагать некоторые промежутки времени, а в другие работать нормально. Время будет течь с разной скоростью, что в итоге может сделать вашу игру неиграбельной.
Производительное железо
На мощном железе проблем не будет, но компьютер будет простаивать, тратя впустую «драгоценное» (видимо это ирония? — прим. перев.) процессорное время. Постыдились бы запускать игру с 25..30 FPS, когда она могла бы выдавать из за 300! Ваша игра потеряет в привлекательности по сравнению с тем, что она могла бы показать при использовании процессора на всю катушку. С другой стороны на мобильных платформах оно может быть и к лучшему — позволит сэкономить энергию.
Вывод
Завязывание FPS на фиксированную скорость игры — решение простое, позволяющее сохранить простоту кода. Но есть проблемы: задав слишком большое значение для FPS мы породим проблемы на слабом железе; задав слишком низкое значение мы неэффективно будем использовать мощное железо.
Скорость игры, зависящая от переменного FPS
Реализация
Другое решение проблемы — дать игре работать как можно быстрее и сделать скорость игры зависящей от текущего FPS. Игра будет обновляться с использованием промежутка времени, потраченного на отрисовку предыдущего кадра.
DWORD prev_frame_tick; DWORD curr_frame_tick = GetTickCount(); bool game_is_running = true; while( game_is_running )
Код усложняется, т.к. мы теперь должны обрабатывать дельту времени в update_game(). Но усложнился код несильно. Я видел много сообразительных разработчиков, которые реализовывали такой подход. Наверняка кто-то из них хотел бы иметь возможность прочитать этот пост, до того, как реализовали такой цикл самостоятельно. Ниже я покажу почему такой подход может иметь серьезные проблемы как на слабом железе, так и на мощном (да… и на мощном тоже).
Слабое железо
Слабое железо может иногда породить задержки в местах, где игра становится «тяжеловата». Это определенно будет иметь место в 3D играх, когда слишком много полигонов отрисовывается. В результате провал в FPS приведет к замедлению обработки пользовательского ввода. Обновление игры будет реагировать на провалы FPS, в результате состояние игры будет изменяться с заметными лагами. В результате время реакции игрока, ровно как и ИИ, замедлится, что может сделать даже простой маневр невозможным. К примеру, препятствие, которое можно преодолеть при нормальном FPS, будет невозможно преодолеть при низком FPS. Еще более серьезные проблемы на слабом железе будут при использовании физики. Симуляция физики может «взорваться».
Мощное железо
Вы можете удивиться тому, что представленная выше реализация игрового цикла может работать неправильно на быстром железе. К сожалению может. И прежде чем показать почему, позвольте немного разъяснить некоторые моменты математики на компьютере. В виду конечной разрядности представления числа в форме с плавающей точкой, некоторые значения не могут быть представлены. Так, значение 0.1 не может быть представлено в двоичном виде и будет округлено при хранении в переменной типа double. Продемонстрирую это с использованием консоли python:
>>> 0.1
0.10000000000000001
Само по себе это нестрашно, но в последовательных вычислениях приводит к проблемам. Пусть у вас есть машина, скорость которой равна 0.001 в попугаях (вольный перевод, прим. перев.). Через 10 секунд машина переместится на расстояние 10.0 попугаев. Если разобьем это вычисление по кадрам, то получим следующую функцию с FPS в качестве параметра:
>>> def get_distance( fps ):
. skip_ticks = 1000 / fps
. total_ticks = 0
. distance = 0.0
. speed_per_tick = 0.001
. while total_ticks < 10000:
. distance += speed_per_tick * skip_ticks
. total_ticks += skip_ticks
. return distance
А нука попробуем посчитать пройденный путь для 40 FPS.
>>> get_distance( 40 )
10.000000000000075
Постойте ка! Это не 10.0 попугаев! Что произошло? Все просто… Т.к. мы разбили вычисление пути на 400 кадров, то при суммировании накопилась значительная ошибка. Представляете что будет при 100 FPS?
>>> get_distance( 100 )
9.9999999999998312
Вот это да! Ошибка стала еще больше. Это потому, что мы делаем еще больше сложений при 100 FPS. Стало быть и ошибка накапливается больше. Таким образом, игра будет работать по-разному при 40 FPS и 100 FPS.
>>> get_distance( 40 ) — get_distance( 100 )
2.4336088699783431e-13
Вы можете подумать, что такая разница незначительна и ею можно пренебречь. Однако, если вы будете использовать это значение еще в каких-либо вычислениях, то проблемы возникнут более серьезные (как пример — интегрирование дифф. ур-ий, прим. перев.). Таким образом, ошибка может накопиться настолько большая, что зафакапит (чуть цензурнее чем в оригинале, прим. перев.) ваш продукт на больших FPS. Вы спросите насколько это вероятно? Достаточно вероятно, чтобы обратить на себя внимание. Я имел честь лицезреть игру с такой реализацией игрового цикла. И, действительно, в ней были проблемы при больших FPS. После того, как разработчик понял, что «собака зарыта» в самом ядре игрового кода, понадобилось отрефакторить тонну кода, чтобы починить багу.
Вывод
На первый взгляд этот тип игрового цикла кажется очень хорошим, но только на первый. Как слабое, так и мощное железо смогут породить проблемы. Кроме того, реализация функции обновления состояния усложнилось по сравнению с первой реализацией. Стало быть в топку ее?
Ограничение FPS: как и зачем? Тринитарная формула фпс лимитеров.
Постоянная скорость игры и максимальное FPS
Реализация
Наша первая реализация, «FPS, зависящее от постоянной скорости игры», имеет проблемы на слабом железе. Она порождает лаги как FPS так и обновления состояния игры. Возможное решение этой проблемы — выполнять обновление состояния с фиксированной частотой, но снижать частоту отрисовки. Ниже код реализации такого подхода:
const int TICKS_PER_SECOND = 50; const int SKIP_TICKS = 1000 / TICKS_PER_SECOND; const int MAX_FRAMESKIP = 10; DWORD next_game_tick = GetTickCount(); int loops; bool game_is_running = true; while( game_is_running ) < loops = 0; while( GetTickCount() >next_game_tick && loops < MAX_FRAMESKIP) < update_game(); next_game_tick += SKIP_TICKS; loops++; >display_game(); >
Игра будет обновляться с фиксированной частотой 50 раз в секунду, а отрисовка будет выполняться с максимально возможной частотой. Заметьте, если отрисовка будет выполняться чаще чем обновление состояние, то некоторые соседние кадрый будут одинаковыми, так что в действительности максимальное значение FPS будет ограничено частотой обновления состояния игры. На слабом железе FPS будет снижаться до тех пор, пока цикл обновления состояния не будет достигать значения MAX_FRAMESKIP. На практике это означает, что игра действительно начнет тормозить, только когда FPS отрисовки проседает ниже значения 5 (= FRAMES_PER_SECOND / MAX_FRAMESKIP).
Слабое железо
На слабом железе FPS просядет, но сама игра будет работать с большой вероятностью на нормальной скорости. Если же железо не сможет выдерживать даже минимальное FPS, то начнет тормозить и обновление состояния, а отрисовка потеряет даже намек на плавную анимацию.
Мощное железо
На мощном железе игра будет работать без особых проблем, но как и в первой реализации процессор будет использоваться неэффективно. Поиск баланса между быстрым обновлением и возможностью работать на слабом железе получает решающее значение.
Вывод
Использование фиксированной скорости игры и максимально возможного FPS — решение, которое несложно реализовать и которое сохраняет код простым. Но все равно имеются некоторые проблемы: задание слишком большой частоты обновления состояния породит проблемы на слабом железе (пусть и не настолько серьезные, как в случае первой реализации), а задание малой частоты обновления состояния будет неэффективно использовать вычислительные мощности (ресурсы можно было бы использовать для увеличения плавности анимаций, но вместо этого они тратятся на частую отрисовку).
Постоянная скорость игры, независящая от переменного FPS
Реализация
Возможно ли улучшить предыдущую реализацию, чтобы она работала быстрее на слабом железе и была бы визуально привлекательнее на мощном? Ну, к счастью для нас, да, это возможно! Состояние игры не нужно обновлять 60 раз в секунду. Пользовательский ввод, ИИ, а также обновление состояния игры, достаточно обновлять 25 раз в секунду (я с этим не согласен, не всегда, прим. перев.). Так что давайте вызывать update_game() 25 раз в секунду, не чаще, не реже. А вот отрисовка пусть выполняется так часто, как железо потянет. Но медленная отрисовка не должна сказываться на частоте обновления состояния. Как добиться этого показано в следующем коде.
const int TICKS_PER_SECOND = 25; const int SKIP_TICKS = 1000 / TICKS_PER_SECOND; const int MAX_FRAMESKIP = 5; DWORD next_game_tick = GetTickCount(); int loops; float interpolation; bool game_is_running = true; while( game_is_running ) < loops = 0; while( GetTickCount() >next_game_tick && loops < MAX_FRAMESKIP) < update_game(); next_game_tick += SKIP_TICKS; loops++; >interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick ) / float( SKIP_TICKS ); display_game( interpolation ); >
В результате реализация update_game() останется простой. Однако, к несчатью, функция display_game() становится более сложной. Вам понадобится реализовать интерполяцию и предсказание. Но не волнуйтесь, это не так сложно, как кажется. Позже я расскажу как работают интерполяция и предсказание, но сначала позвольте показать вам зачем они нужны.
Зачем нужна интерполяция
Состояние игры обновляется 25 раз в секунду. Поэтому, если не используется интерполяция, то и кадры будут отображаться с той же максимальной частотой. Тут нужно заметить, что 25 кадров в секунду это не так медленно, как кому-то может показаться. К примеру, в фильмах кадры сменяются с частотой 24 кадра в секунду. Так что 25 кадров в секунду кажется достаточным, но не для быстро движущихся объектов. Для таких объектов следует увеличить частоту обновления состояния, чтобы получить более плавную анимацию. Альтернативой увеличенной частоте обновления как раз и служит связка интерполяции и предсказания.
* Прим. перев.: в движке NeoAxis для физического объекта можно выставлять флаг Continuous Collision Detection; подозреваю, что по нему как раз и выполняется обработка, подобная описанной выше реализации игрового цикла.
Интерполяция и предсказание
Как было написано выше, состояние обновляется на своей, независимой, частоте. Поэтому возможна ситуация, когда отрисовка начинается между двумя последовательными тиками. Пусть вы обновили состояние в 10 раз. Затем вызывается отрисовка и выполняется она где-то между 10 и 11 тиками. Пусть это будет дискретное время 10.3. В результате «interpolation» будет иметь значение 0.3. В качестве примера, представьте машину, движущуююся следующим образом:
position = position + speed;
Если на 10 шаге цикла обновления состояния позиция будет 500, скорость будет 100, тогда на 11 шаге позиция будет 600. Так какова же будет позиция машины во время отрисовки? Можно просто взять позицию на последнем шаге, т.е. 500. Но куда лучше предсказать позицию на следующем шаге и произвести интерполяцию для времени 10.3. Получим код вида:
view_position = position + (speed * interpolation)
Таким образом машина будет отрисована в позиции 530. Переменная «interpolation» в общем случае содержит значение от 0 до 1 относительной позиции во времени между текущим и следующим кадрами (переделано для лучшего понимания, прим. перев.). Нет нужды делать предсказание слижком сложным, чтобы обеспечить плавность анимации. Конечно, возможна ситуация когда один объект частично пересечется с другим непосредственно перед детектированием коллизии. Но, как мы увидели ранее, состояние игры обновляется 25 раз в секунду, поэтому артефакт рендеринга будет виден лишь долю секунды (а что если плотность объектов велика и коллизий много? — прим. перев.) и с малой вероятностью он будет замечен пользователем.
Слабое железо
В большинстве случаев update_game() будет выполняться намного быстрее, чем display_game(). Фактически мы можем принять как данность, что даже на слабом железе функция update_game() вызывается 25 раз в секунду. Поэтому наша игра будет обрабатывать пользовательский ввод и обновление состояние без особых проблем даже в случае, когда отрисовка выполняется на частоту 15 кадров в секунду.
Мощное железо
На мощном железе, игра будет по-прежнему идти с фиксированной скоростью 25 тиков в секунду, но отрисовка будет выполняться быстрее. Интерполяция + предсказание добавят привлекательность анимации, т.к. фактически рендеринг будет выполняться на более высоком FPS. Прелесть в том, что таким образом вы мошенничаете с FPS. Вы не обновляете состояние игры с большой частотой, а лишь картинку. Но при этом ваша игра все равно будет иметь высокое FPS.
Зачем Опытные Игроки Ограничивают FPS ?
Вывод
Развязка обновления и отрисовки друг от друга кажется лучшим решением. Однако при этом необходимо реализовать интерполяцию и предсказание в display_game(). Правда задача эта не слишком сложная (лишь при использовании примитивной механики объекто, прим. перев.).

Заключение
Игровой цикл не такая уж и простая вещь, как вам может показаться. Мы рассмотрели 4 возможные реализации. И среди них есть по крайней мере одна (где обновление состояния жестко завязано на FPS), которую вы определенно должны избегать. Постоянная частота кадров может быть приемлемой на мобильных устройствах. Однако, если вы хотите портировать игру на разные платформы, то придется развязывать частоту обновления и частоту отрисовки, реализовывать интерполяцию и предсказание. Если не хотите заморачиваться с предсказанием и интерполяцией, то можете использовать большую частоту обновления состояния, но найти оптимальное ее значение для слабого и мощного железа может оказаться сложной задачей.
Попутные статьи (от переводчика)
- habrahabr.ru/blogs/silverlight/125037 — Игровой цикл в SL
- habrahabr.ru/blogs/gdev/112444 — там есть упоминание о том, что в Unity3D нет игрового цикла как такового (видимо он запрятан?)
- habrahabr.ru/blogs/gdev/102930 — про создание игрового движка
- habrahabr.ru/blogs/android_development/136968 — пример игры на кокосе
- gafferongames.com/game-physics/fix-your-timestep — еще одна статья про дискретное время в играх
Кадры в секунду и частота монитора: как они связаны?

Разговоры о реальной необходимости больших значений FPS в играх и мониторах с повышенной частотой обновления ведутся уже давно. Многие считают, что гонка за герцами и кадрами в секунду не имеет смысла, особенно когда частота монитора не превышает 60 Гц. Cybersport.ru объяснит, почему больше — это в любом случае лучше и кому это поможет.
На что способен человек
С самого начала развития кинематографа и анимации появился миф о том, что 24 кадра в секунду — максимум, что может распознать человек. Якобы делать больше нет абсолютно никакого смысла, и визуально плавность анимации никак не изменится.
Для человека слайдшоу превращается в анимацию уже на частоте примерно 15 кадров в секунду. Но чем выше частота кадров, тем лучше воспринимается картинка. А 24 кадра никак не связаны с физиологией. В основе такого формата больше лежит экономические и технические моменты — киноплёнка тех времён и оборудование для воспроизведения были наилучшими по соотношению цена-качество.
С развитием технологий люди создали новые носители, аналоговые передачи сменились цифровыми: мы смогли перейти на 30 кадров в секунду и больше. Например, система IMAX воспроизводит 48 кадров в секунду, а трансляции игр на Twitch — до 60 FPS. И только скажите, что не замечаете, как картинка на 60 кадров в секунду становится плавнее, чем на 30!
После 60 FPS разницу на большей частоте при просмотре видео уловить сложнее. Тут больше зависит от индивидуального восприятия каждого человека. Например, в американских ВВС проходил тест среди пилотов истребителей. И те умудрялись не просто заметить самолёт, который отображался за один кадр в видеоряде с частотой 220 кадров в секунду, но и назвать его модель. Так что точного ответа на вопрос, сколько кадров распознаёт человек, не существует.
На что способен монитор
Сейчас у большей части мониторов частота обновления равна 60 Гц. Но технологии ушли вперёд, и мы уже можем делать матрицы, которые будут выдавать и 120 Гц, и 144, и даже 240. Но зачем? Мониторы с большой частотой стоят значительно дороже, а пользу ощущают далеко не все. У современного видео частота не превышает 60 кадров в секунду, а значит, и спрос на мониторы с большей частотой обновления невелик.
Но если мы говорим об играх, то они выдают гораздо большие значения FPS, чем видеоконтент. В Counter-Strike: Global Offensive, например, частота и вовсе не ограничена. А самые искушённые игроки ощущают лаги меньше чем при 300 FPS. Чтобы эти кадры в секунду использовались с максимальной эффективностью, нужен монитор с большей частотой обновления.
Приведём простой пример. В первом случае вы сидите и смотрите со стороны, как кто-то играет в CS:GO на мониторе с частотой обновления 144 Гц и с 300 FPS, а рядом сидит человек с монитором на 60 Гц и 60 FPS в игре. Очевидной разницы в изображении для вас не будет никакой. Но если вы сядете на места игроков, то вы сразу почувствуете, что всё происходит чётче, плавнее и точнее.
Это можно доказать и на цифрах. При частоте 60 Гц кадр меняется каждые 16 мс, а при 144 Гц — каждые 6 мс. Несмотря на то что почти трёхкратная разница вообще не будет заметна глазу, мелкая моторика человека после нескольких лет оттачивания мастерства игры использует эти 10 мс для более точного наведения прицела на голову. Это невозможно объяснить словами, только прочувствовать. Все киберспортсмены, кстати, требуют от организаторов использовать мониторы со 144 Гц.
Во-первых, разница между любым профессиональным игроком и его оппонентом настолько мизерна, что даже такие мелочи могут решить исход сражения. Во-вторых, они играют на такой частоте везде — дома, на буткемпе и на других турнирах. За долгое время они привыкли к 144 Гц. На меньшей частоте они не просто не смогут реализовать свой потенциал и будут чувствовать сильный дискомфорт. Им будет казаться, что всё тормозит и лагает.
Кадры лишними не бывают
Может ли монитор с 60 Гц отобразить больше 60 кадров в секунду? Нет, не может. Другой вопрос, что именно он отобразит. Вывод изображения на экран и рендер кадров на компьютере не происходят одновременно. Существует небольшая задержка, которая называется Input Lag. Когда вы двигаете мышкой или нажимаете клавишу, на экране это применится только в следующем кадре.
Если вы играете на 60 FPS, то минимальная разница между движением и отображением составит примерно 16 мс. Если же частота в два раза больше, то перед показом следующего кадра система успевает зарендерить два, а на экран будет выведен более актуальный. Итого, задержка сокращается вдвое. Исходя из этого напрашивается вывод: больше FPS — это всегда хорошо, вне зависимости от того, какая у монитора частота обновления.
Техника не чит, а инструмент
Что будет, если дать обычному человеку самую крутую кисть, краски, холст и попросить его написать шедевр прямо здесь и сейчас? Очевидно, ничего у него не выйдет. Для того чтобы достичь результата, нужна практика, тренировка и сноровка. Если за тысячу часов в CS:GO на мониторе 60 Гц и с 60 FPS вы так и остались сильвером, то никакие мониторы и показатели FPS не сделают из вас чемпиона мейджора. На результат слишком сильно влияет человеческий фактор — форма, настроение, состояние, реакция и масса других особенностей. Ни в коем случае нельзя сводить всё к техническим аспектам.
Всё зависит от потребностей и возможностей. Некоторых устраивает даже 30 FPS и они не видят смысла тратить несколько тысяч долларов на мощный компьютер с самым новым железом и тем более на монитор с частотой 120 Гц и больше. Другие же чувствуют плохую отзывчивость управления даже на 60 Гц, хотя ни разу не пробовали большую частоту. А на топовом уровне всё должно быть самое лучшее — скилл игроков и условия, в которых они выступают. Для того чтобы они могли реализовать свой потенциал на максимум, им нужны инструменты с максимально возможными характеристиками. Профессионалы в курсе, как реализовывать эти собранные по крупицам миллисекунды, а у равных по скиллу соперников именно они решают исход сражения.
Fps игры что это
Итак, что же такое этот fps?
Человеческие глаза.
Что такое фпс? Зачем нужен в играх? | Все о фпс
FPS и человеческий глаз: сколько fps воспринимает глаз?
FPS глаза и ощущение реалистичности.
Эффект размытия и FPS.
Комментарии
Итак, что же такое этот fps?
Фпс или Frames per Second (FPS) — количество сменяемых кадров за единицу времени в телевидении и кинематографе.
Общепринятая единица измерения — кадры в секунду.
В компьютерных играх под кадровой частотой понимается частота, генерируемая само́й игрой в зависимости от ресурсов компьютера и необходимости передачи движений разной интенсивности. Понятие «Фреймрейт» (англ. Framerate) используется, как жаргонное обозначение такой частоты кадров. При этом игры можно разделить на два класса: игры с постоянной кадровой частотой и игры с переменной кадровой частотой. Игры с постоянной кадровой частотой выдают на слабых и мощных компьютерах одинаковое количество кадров в секунду. Если ресурсы компьютера невелики и он не справляется с прорисовкой, то замедляется вся игра. Игры с переменной кадровой частотой на слабых компьютерах начинают пропускать кадры, скорость игрового процесса не меняется.
В любом случае, выдаваемая игрой кадровая частота обычно не кратна кадровой частоте монитора, это приводит к рваному изображению. Для борьбы с этим существует режим вертикальной синхронизации (англ. V-Sync), а также плавающая синхронизация (технологии «FreeSync» и «G-Sync»).
Человеческие глаза.
Человеческий глаз сам по себе непрерывно воспринимает информацию, а не через кадры, то есть он способен «собирать» несколько кадров и «превращать» их в движение. Наиболее подходящей и комфортной частотой смены кадров принято считать 24 кадра. Это, к слову, общемировой стандарт частоты киносъемки и проекции.
Часто можно слышать, что 24 кадра — это предел человеческого глаза, что является вымыслом. Это всего лишь формат, к которому пришли кинематографические и телевизионные студии. Есть информация, что максимальная частота кадров для человеческого глаза — 120 или даже 150 кадров в секунду, но многие ученые в этом сомневаются. Зато 50-60 кадров в секунду — частота более реальная.
Другое дело, что человеческий глаз способен засекать объекты, показанные при очень высокой частоте кадров. Был проведен эксперимент, когда людям было предложено посмотреть видео с частотой 220 кадров в секунду. В одном из кадров находился летающий объект. Так вот, практически все подтвердили, что в кадре они видели некий объект, рассмотреть который был невозможно из-за очень высокой частоты кадров. Но важен тот факт, что люди его все же заметили.
Так что в итоге получилось? Мы поддержим ученых, которые подтверждают тот факт, что человеческий глаз видит до 50-60 кадров в секунду.
А теперь переходим к главному.
Герц (русское обозначение: Гц, международное обозначение: Hz) — единица частоты периодических процессов (например, колебаний) в Международной системе единиц (СИ) а также в системах единиц СГС и МКГСС. но вам то что до этого, да?
Частота обновления экрана — частота, с которой на матрицу монитора подаются сигналы о изменении цвета пикселей.
На большинстве мониторов это значение равно 60Гц. Данную настройку использует операционная система для ограничения FPS всех приложений, работающих, под управлением OC (Рабочий стол, МС Офис, браузер и т.д.) Ограничение необходима, что бы не загружать видеокарту на 100% во время работы например с браузером (ведь вам не нужны 1000 FPS).
По идее фпс и частота должно совпадать, во первых это самый премитивный способ плавной смены кадров и отсутствия разрывов, во вторых ваш компуктер тратит на это меньше сил. P.s компуктер это не ошибка, нравится мне их так называть.
Короче говоря если вам не интересно: 60 фпс лучшая велечина для вас.
Вы считаете что 300 фпс это лучше 60? Тогда прошу читать дальше.
FPS и человеческий глаз: сколько fps воспринимает глаз?
Инертность, как аналог FPS для человеческого глаза
Аналогом FPS является инертность палочек и колбочек — фоторецепторы светочувствительных клеток сетчатки глаза.
Инертность — это время необходимое рецептору для того, что бы воспринять новую информацию.
И тут начинаются первые проблемы.
во-первых палочки и колбочки по-разному воспринимают движение и цвет. Палочки в 100 раз менее чувствительны к цветам, но имеют значительно меньшую инертность. Т.е. их FPS больше. Но они практически не способны различать цвета;
во-вторых эти фоторецепторы размещаются на сетчатки НЕравномерно. Колбочки (которые имеют низкий FPS но хорошо распознают цвета ) расположены в центре в перемешку с колбочками. По бокам сетчатки находятся только палочки.
Идея матушки природы проста — по бокам расположено то, что максимально чувствительно к движению. Задача этих рецептором просто сигнализировать о том, что «что-то движется вон в тех кустах сбоку». Затем человек может повернуть голову и рассмотреть это «что-то» уже более чувствительными рецепторами — ба-а! да это же большая полосатая голодная тигра! =)
Очевидно, что человек, работающий на компьютере использует по большей части центр сетчатки.
По этому в данном случае целесообразно говорить исключительно о среднем FPS именно смеси палочек и колбочек.
Но как его посчитать?
На одном сайте мне удалось найти результаты исследований на эту тему.
Пруф: Способ определения времени инерционности зрительной системы человека [www.findpatent.ru]
Минимальная инертность составила 20 мс.
Иначе говоря мы получаем FPS 50 кадров в секунду.
Означает ли это, что FPS выше этого значения никак не будет ощущаться глазом?
FPS глаза и ощущение реалистичности.
Зрительная система человека не ограничивается глазом. Глаз это лишь «сенсор», информация из которого воспринимается не напрямую, а проходит сложный и до конца не изученный процесс постобработки. Этим объясняется существование оптических иллюзий.
Для примера взгляните на эту картинку.
Очевидно, что здесь всего 1 кадр, однако мозг воспринимает сигналы получаемые от палочек ( с переферии зрения) и тарктует их как признаки движения, это позволяте ему самому «дорисовывать» кадры и делать плавное движение всего из 1 кадра.
Эффект размытия и FPS.
Человеческий глаз способен воспринимать наибольшее FPS на переферии зрения. Современные мониторы еще не достигли таких размеров, что бы покрывать все поле зрения человека. И это накладывает определенные ограничения на степень реалистичности картинки. Разработчики видеоигр понимают это и поэтому придумали добавлять по краям экрана эффект размытия, этот эффект позволяет мозгу воспринимать происходящее на экране более реалистично. В то же время размытие снижает требование к FPS на краях экрана, т.к. мозг фиксирует УЖЕ ИСКУСТВЕННО размытое изображение. Соответственно для обеспечения нужного уровня реалистичности хватает меньшего FPS.
Принимая во внимание чрезвучайную сложность постобработки синалов человеческим мозгом, указать точное значение фпс, воспринимаемое нами, с точностью до единицы попросту невозможно.
Можно оттолкнуться только от физического предела восприятия в 20 мс, что равнозначно 50 FPS.
В тоже время учитывать, что края монитора захватываются частью переферийного зрения, где чувствительность рецепторов выше, но как мы поняли в этой области изображения разработчики игр научились обманывать зрительную систему.
В итоге рациональным является остановиться на 60 FPS взяв 10 FPS прозапас для просмотра видеоряда в котором нет эффекта размытия по краям.
Правоту данного расчета подтверждают
стандарт операционной системы принятия частоты обновления монитора 50-60 ГЦ = 50-60 FPS.
передовая технология 3D-Vision, поддерживающая 120 Гц (т.е. по 60 Гц на глаз)
- Вашему компьютеру это не составляет никакого труда
- Ваш монитор поддерживает большую частоту, герцовку что реально изменит картинку(чем больше Гц, тем плавнее картинка и меньше артефактов)
Похожие статьи
-
Именно для того, чтобы увеличить плавность анимации тогда, когда изменения в кадрах минимальны, а изображение не перегружено деталями — нужен монитор с…
-
Во-во. Я думал будут всякие хитрости от разработчиков по снижении нагрузки на железо путем особой геометрии или спрятанных в текстурах объектов. Как…
-
« Геймеры — это особая часть населения, способная работать близко к максимальным уровням зрения », — утверждает профессор психологии Джордан Делонг. Не…