Delta-time. Время и пространство независимо от FPS.

уроки, мануалы, советы по Construct 2

Сообщение Delta-time. Время и пространство независимо от FPS.
» 30 авг 2015, 18:16

Оригинал статьи на английском можно найти тут. Перевёл и приукрасил сам.

Framerate independent игры это игры которые работают на одинаковой скорости, вне зависимости от фреймрейта(FPS).

Что делать если ваша игра в зависимости от мощности компьютера выдаёт разную частоту FPS? Например на слабых компьютерах она работает в 30 FPS а на более мощных 60 FPS. В этом случае скорость появления и перемещения объектов окажется разной, и как следствие это может испортить впечатление от вашей игры у обладателей слабых устройств=(
В этом руководстве я попытаюсь объяснить как сделать вашу игру независимой от FPS или влиять на скорость отдельных объектов или игры в целом.

Что такое Delta-time.
Delta означает изменение в количестве, соответственно Delta-time - количество изменений во времени. Это время в секундах с момента последнего тика. В Construct 2 выражение обозначающиее Delta-time пишется как dt.

Пример:
Если игра выдаёт 100 FPS, dt будет равен 0,01(сек).
При 10 FPS dt равен 0,1(сек)

Иными словами, в рамках одной секунды ваш компьютер отрисовал экран к примеру от 10 до 100 раз, это от 10 до 100 изменений(Delta) в единицу времени(time). Таким образом логично что при 1 FPS, dt равен 1.
Несмотря на то что понятия FPS и Delta-time близки по смыслу, FPS высчитывается ежесекундно в то время как dt варьируется каждый тик. Поэтому примите во внимание что в особо динамичных играх падение FPS даже где-то на 20-30% за секунду станет игроку заметно, Delta-time поможет вам сбалансировать скорость вне зависимости от FPS.
Если создать событие которое будет прибавлять каждый тик dt к переменной, то значение переменной всегда будет увеличиваться на 1 ровно раз в секунду.

Как использовать dt.
Рассмотрим пример.
Изображение
Каждый тик(раз в кадр), объект перемещается на 1 пиксель вправо. Таким образом при 30 FPS он будет перемещаться со скоростью 30 пикселей в секунду, а при 60 FPS скорость будет 60 пикселей в секунду.
Теперь, помним что вне зависимости от количества FPS и количество тиков, dt увеличивается на единицу каждую секунду, давайте используем это таким образом:
Изображение
Умножаем 60 на dt и за секунду результат увеличиться до 60, и теперь наш бъект смещается вправо на 60 пикселей вне зависимости от FPS. БАМ! Выкуси нестабильный FPS=P

Используйте dt везде!
Каждый раз когда вам необходима постоянная скорость, пользуйтесь dt для точнейшего результата. Например применяя к спрайту действие Move forvard просто умножьте его скорость на dt и получите постоянную скорость под заданным углом.

Все поведения(behaviors) по умолчанию используют dt.
Всё что движется при помощи поведений Construct 2, уже учитывает dt и не требует наших корректировок. За единственным исключением поведение Physics, по умолчанию его рассчёты не учитывают dt. Всё потому что dt имеет небольшие случайные вариации, и при его использовании в Physics результат может получиться разным, чем без его использования, даже если тестировать одну и ту же ситуацию неоднократно. Так что всегда учитывайте что поведение Physics зависит от FPS.
Тем не менее, вы можете использовать dt для Physics если в событие on start of layout добавить к объекту действие Set Stepping Mode и выбрать Framerate independent. В этом случае максимальный временной шаг уменьшится до 1/30(около 33 милисеков), из за того что при большом временном шаге может произойти сбой в физических симуляциях вызывающий парадокс пространственно-временного континума, ну вы поняли. Я предупредил.

Временная шкала(Time Scale)
Time Scale позволяет нам изменять скорость игры. Вы можете изменять её используя действие Set Time Scale из группы System. Всё очень просто, значение 1.0 в действии Set Time Scale оставит нормальную скорость, при значении 0,5 она уменьшиться на половину, поставьте 2.0 и темпы увеличатся вдвое. Попробуйте снизить скорость до 0.1, игра замедлиться в 10 раз и при этом останется плавной - идеальный эффект слоумошечки.
Set Time Scale использует dt в своих вычислениях, это значит что его работа повлияет на скорость всех поведений Construct 2 и любых других действий использующих dt. Если же в вашей игре будут присутствовать события подобные этому:
Изображение
...вам необходимо добавить dt в выражениях чтобы Set Time Scale на них подействовал.

Пауза.
Вы можете поставить 0 в Set Time Scale и все движения прекратяться. Это самый простой способ создать паузу в игре. Соответственно верните 1 и игра продолжиться.
Но, при такой "паузе" управление в игре всё ещё будет срабатывать. Чтобы это обойти, добавьте всё управление в группу и активируйте/деактивируйте её чтобы продолжить/остановить игру. Так же, это отличный способ проверить все ли движения в вашей игре подчиняются dt, при Time Scale=0 все не зависящие от dt объекты продолжат движения.

Другие типы движений.

Важно помнить что все движения в игре должны зависить от dt чтобы добиться правильного взаимодействия объектов.

Вращение.
Аналогично предъидущему примеру мы можем повлиять и на скорость вращений.
Изображение
Получаем 30 градусов в секунду при 30 FPS, и 60 градусов в секунду при 60 FPS - опять, разная скорость при разном FPS.
Добавляем dt тем же способом.
Изображение
БАМ! И снова выкуси нестабильный FPS!=Р


Ускорение.
С ускорением так же всё просто. Во всех ускоряющих событиях без использования поведений Construct 2 так же добавляем dt.
Можно к примеру присвоить объекту переменную speed, и создать подобное действие
Изображение
...ваш объект движется на значение speed в секунду.
Предположим, мы хотим чтобы объект ускорялся на длину 100 пикселей за секунду, тогда необходимо прибавлять к переменной speed выражение 100*dt, в этом случае получаем прирост скорости на 100 пикселей за секунду.
Изображение

Lerp. Линейные интерполяции.
Используюя линейную интерполяцию, при перемещении между двумя статичными точками, типа lerp(a, b, x), просто умножайте x на dt. Немного сложнее в случае если значения динамичны, к примеру если вы используете выражение навроде Set X to lerp(Self.X, Target.X, х*dt), результат может получиться не совсем точным. Просто используйте формулу lerp(a, b, 1 - х ^ dt), где х будет значение от 0 до 1, например 0,5.
Изображение
Это проверенный и более менее хороший вариант, вы можете окунуться в мир математических обоснований этому прочитав данную статью.

Никогда не делайте этого!
Никогда не используйте dt с условием Every X seconds! Значение FPS будет влиять на работу этого условия и вы не получите нужного результата. Например Every 1 seconds будет срабатывать с интервалом 6 секунд при 10 FPS (dt=0,1), или каждые 0,6 секунд при 100 FPS(dt=0.01).

Тяжёлые случаи.
При крайне низком значении FPS, значения dt становятся больше и если к примеру мы имеем 5 FPS тогда dt станет равен 0,2. Сейчас я вам расскажу что это значит. Допустим при заданной скорости 500 пихелей в секунду, объект сместиться на 100 пихелей за тик. Практически это выйдет как телепортация, и при таком результате некоторые колизии могут не сработать, объект проскочит сквозь стену и тому подобное, думаю понятно=)
Именно для таких случаев в Construct 2 заложено ограничение на величину dt, и его максимальное значение 0,1.
Если всё же падение FPS ниже 10 произошло, тогда в игре мы будем наблюдать слоумошечку=( Здесь мы уже безсильны и лимит на dt в этих случаях более менее сносный компромис для устранения телепортаций.

Рандомные вариации.
Как уже упоминалось, в случае с поведением Physics, Delta-time имеет незначительные рандомные вариации, это связанно, как правило, с несовершенством таймеров в компьютере. Во всех же остальных случаях кроме Physics эти незначительные искажения будут практически незаметны. Рекомендую всегда использовать dt в играх если не требуется большая точность(что бывает крайне редко).

Временная шкала отдельных объектов.
Вы можете задать пропорцию времени индивидуально для каждого бъекта, при помощи Set object time scale из группы System. Это позволит вам, к примеру, замедлять игру до пропорции 0,3 и при этом иметь объект перемещающийся с нормальной скоростью 1.
Изображение
Можно управлять dt индивидуально для каждого объекта через выражение типа Player.dt. Таким образом мы имеем разные значения dt, одно для игры и другое для объекта Player, соответственно разные объекты игры могут иметь разную скорость.
Вернуть значение скорости по умолчанию можно с помощю действия Restore object time scale.

Послесловие.
Крайне важно использовать dt в играх с самого начала их создания. Это улучшит работу приложения и взаимодействие объектов. Не ограничивайте свои игры системными требованиями в надежде что пользователи закупились прекрасным железом чтобы играть в вашу игру. Используйте полученные знания, подчините пространство и время чтобы как можно больше людей получили удовольствие от ваших творений=)
И не забывайте что все поведения в Construct 2 исользуют корректировки Delta-time(за исключением Physics конечно, но как уже упоминалось, даже его можно подстроить под dt). Если ваша игра использует только встроенные поведения, можете не пользоваться dt, однако, если в вашей игре присутствуют движения управляемые событиями, вы уже знаете как их сделать независимыми от FPS.
Последний раз редактировалось Kanske 30 авг 2015, 19:28, всего редактировалось 1 раз.
Аватара пользователя

Участник
Сообщений: 317
Я тут с 02 авг 2014
Откуда: Москва
Лицензия: Peronal
Репутация 124 [ ? ]

Сообщение Delta-time. Сквозь время и пространство независимо от FPS.
» 30 авг 2015, 18:26

понравилось)) с удовольствием почитал бы что-нибудь еще. Про dt узнал, когда смотрел различные плагины)
Аватара пользователя

Администратор
Сообщений: 2393
Я тут с 06 сен 2012
Откуда: Санкт-Петербург, Южно-Сахалинск
Skype: sirg1987
Репутация 261 [ ? ]

Сообщение Delta-time. Время и пространство независимо от FPS.
» 30 авг 2015, 19:27

Sir_G, спасибки=) Старался=)
В вопрос-ответе, чел Developed мне скинул примерчик, там был dt, я такой "чо за...?!", дай погуглю, и фигакс, БАМ!Перевёл статью=)
Ах ну да, статья не моя же, надо написать же автора. Ща поправлю...
Аватара пользователя

Участник
Сообщений: 317
Я тут с 02 авг 2014
Откуда: Москва
Лицензия: Peronal
Репутация 124 [ ? ]

Сообщение Delta-time. Время и пространство независимо от FPS.
» 30 авг 2015, 20:14

Плюсуем 2 раза. Давно хотел урока. Спс
В работе над многим
Аватара пользователя

Участник
Сообщений: 639
Я тут с 28 июл 2015
Откуда: Комсомольск-на-Амуре
Репутация 19 [ ? ]

Сообщение Delta-time. Время и пространство независимо от FPS.
» 24 сен 2015, 03:30

Я думал дт это дистанция, спс!
Не пройдя сквозь тьму, не увидеть света.
Crazy Stories
Аватара пользователя

Участник
Сообщений: 498
Я тут с 08 июл 2015
Откуда: Из цикла
Двиг: construct 2
Лицензия: personal
Репутация −4 [ ? ]



Вернуться в Уроки по Construct 2

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх