Движение объекта прерывисто, когда частота кадров ограничена

У меня были некоторые проблемы с изменчивым движением объектов в игре.

Если частота кадров не ограничена, игра идет гладко.

Если я ограничу частоту кадров, скажем, 60 кадров в секунду, движение будет прерывистым.

Движение объекта выглядит следующим образом...

m_distance += m_speed * GetFrameTime()

Где скорость в пикселях в секунду, а GetFrameTime() возвращает время, прошедшее с последнего кадра. Обратите внимание, что объекты перемещаются только в направлениях x и y.

Я использую SFML, с функциями SetFramerateLimit(60) а также UseVerticalSync(true), Пытаясь решить проблему с изменчивым движением, я прочитал статью разработчика XNA о том, как они обновляются один раз, рендерится один раз, а затем, если в игровом цикле остается время <частота кадров (т.е. 1/60), тогда они ' Я буду спать до конца этого периода. Я считаю, что это то, что делает SFML, потому что я отключил эти функции и написал в этом поведении, и у меня появились те же симптомы.

Сейчас я не говорю, что вышеуказанный подход - это плохо. На самом деле, мне нравится, что приложение не выполняет ненужную работу (есть заметная разница в использовании ресурсов при запуске приложения с заданным пределом кадров и без него). Однако я действительно не знаю, почему движение прерывистое. Я читал статьи о gafferongames, но они здесь не применяются.

Любая помощь приветствуется, спасибо.

Изменить: я определил проблему, теперь просто не знаю, как ее решить.

На кадрах, где объект "прыгает", m_distance значительно больше расстояний в других кадрах. При ближайшем рассмотрении GetFrameTime() также значительно больше, чем предыдущие времена между кадрами (значительная разница составляет 2-3 мс).

Edit2: я думаю, что я нашел решение благодаря http://gafferongames.com/game-physics/fix-your-timestep/. Установите фиксированное время дельты вместо использования GetFrameTime.

1 ответ

Единственная причина когда-либо использовать:

m_distance += m_speed * GetFrameTime();

если вы пытаетесь получить независимое от фрейма движение. В этом случае нет причин ограничивать ваш FPS.

Если у вас есть ограничение FPS, например, что реализует SFML, я рекомендую сохранять постоянное движение для каждого кадра. То есть примерно так:

m_distance += m_speed;
Другие вопросы по тегам