Независимость игры от частоты кадров. Time.deltaTime

Очень часто при использовании Time.deltaTime я натыкалась на следующую фразу: “С помощью Time.deltaTime можно обеспечить независимость игры от частоты кадра”. Но мне было непонятно, каким образом, умножая на это значение мы получаем независимость?
Итак, приступим …

Первым делом нужно разобраться с fps

Frames per second – количество кадров в секунду. Сейчас стандартным значением считается 60 кадров в секунду. Мы знаем, что метод Update() вызывается каждый кадр. Мы будем перемещать gameObject в методе Update(), следующим образом:


Каждый кадр, gameObject будет перемещаться на 5 юнитов по оси X.

Простая математика

Представим ситуацию у вас и вашего друга есть компы. Дело в том, что ваша машина тянет fps = 60, а у вашего друга fps = 30. Если запустить этот скрипт, то увидим явную зависимость игры от частоты кадров.

gameObject на вашей машине будет перемещаться
60 * 5 = 300 юнитов в секунду.
У вашего друга, при fps = 30:
30 * 5 = 150 юнитов в секунду.
Вывод: При текущем положении дел, одна и таже игра будет по-разному вести себя на разных машинах.

На помощь приходит Time.deltaTime

Как сказано в документации это время, которое необходимо для отрисовки последнего кадра.
Теперь, вернемся к скрипту и умножим значение speed на Time.deltaTime.

Независимость на лицо

У нас 60 кадров в секунду, соответственно время на отрисовку кадра равно: 1/60 = 0.0167 с
В результате, мы получаем:
60 * 5 * 0.0167 = 5 юнитов в секунду
А что происходит при fps = 30?
При fps=30 время на завершения кадра равно: 1/60 = 0.033
30 * 5 * 0.033 = 5 юнитов в секунду
Таким образом, при разных fps объект проходит одинаковые расстояние.

Отдельно про FixedUpdate()

Если вы работает с физическим телом, то известно, что все манипуляции нужно проводить в методе FixedUpdate(). В этом случае, не нужно умножать на Time.deltaTime, так как FixedUpdate() вызывается независимо от частоты кадров.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *