Задать вопрос
@Kuusandr

Слишком быстрый fps. Как сделать движения игрового объекта более медленным?

Сделал простенький проект, с тайловой механикой. Возникла проблема, слишком много fps, главный игровой объект перемещается слишком быстро. Погуглил интернет, попробовал применить совет по ограничению fps (с засыпанием на расчетное время в render). Скорость передвижения, вроде стала более плавной. Но с этим возникла другая более отстойная проблема, при ограничении fps смарт стал реагировать с заметной задержкой на тапы.

Как сделать более медленное передвижение игрового объекта при сохранении fps?
  • Вопрос задан
  • 325 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
tsarevfs
@tsarevfs
C++ developer
Расчитывайте движение объекта исходя из желаемой скорости как dx = v * dt. Для вычисления dt вычитайте таймстемп с предыдущего кадра из текущего таймстемпа.
Ответ написан
Комментировать
Beshere
@Beshere
Разработчик
Насколько я помню, в метод render() передаётся dt - время между кадрами. Умножайте скорость объектов на него - получите постоянную скорость для пользователя независимо от железа.

P.S. Лучше саму математику вычислений засунуть в update(), а в render() только рисовать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SagePtr
@SagePtr
Еда - это святое
Первое правило - никогда не привязывайте скорость к FPS. Мне попадалась игра, которую было невозможно пройти на медленном железе, потому что скорость игрока по каким-то причинам привязывалась к FPS, а скорость игровых событий - к времени, в итоге если FPS был в районе 30 - то игрок попросту не успевал в тех местах, где нужно было на скорость что-то сделать, а запас времени не давался.
Да и просто неприятно, когда всё начинает медленно шевелиться, пропуск кадров намного лучше, так как не замедляет игру, а только картинку ухудшает.
Ответ написан
Комментировать
@GreatRash
Но с этим возникла другая более отстойная проблема, при ограничении fps смарт стал реагировать с заметной задержкой на тапы.


Во всех игровых движках игровой цикл делится на две части: обработка физики (PhysicsUpdate, _physics_process и т.п.) и обработка логики/пользовательского ввода (Update, _process и т.п.)

Отслеживать ввод вам нужно внутри обычного апдейта с максимально возможным фпс. А вот уже применять физику (т.е. двигать объекты и т.п.) нужно с применением апдейта физики с дельтой времени кадра.

Вот норм туториал на тему - https://gameprogrammingpatterns.com/game-loop.html
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы