У меня были некоторые проблемы с прерывистым движением объектов в игре.
Если частота кадров не ограничена, игра работает гладко.
Если я ограничу частоту кадров, скажем, 60 кадров в секунду, движение будет прерывистым.
Движение объекта выглядит следующим образом ...
m_distance += m_speed * GetFrameTime()
Где скорость в пикселях в секунду, а GetFrameTime () возвращает время, прошедшее с последнего кадра. Обратите внимание, что объекты перемещаются только в направлениях x и y.
Я использую SFML с функциями SetFramerateLimit(60)
и UseVerticalSync(true)
. Пытаясь решить проблему с изменчивым движением, я прочитал статью разработчика XNA о том, как они обновляются один раз, рендерится один раз, а затем, если в игровом цикле остается время <частота кадров (то есть 1/60), тогда они ' Я буду спать до конца этого периода. Я считаю, что это то, что делает SFML, потому что я отключил эти функции и написал в этом поведении, и у меня появились те же симптомы. </p>
Теперь я не говорю, что вышеуказанный подход - плохая вещь. На самом деле, мне нравится, что приложение не выполняет ненужную работу (есть заметная разница в использовании ресурсов при запуске приложения с заданным пределом кадров и без него). Однако я действительно не знаю, почему движение прерывистое. Я читал статьи о gafferongames, но здесь они, похоже, не применяются.
Любая помощь приветствуется, спасибо.
Редактировать: Я идентифицировал проблему, теперь просто не знаю, как ее решить.
В кадрах, где объект "прыгает", m_distance значительно больше расстояний в других кадрах. При ближайшем рассмотрении GetFrameTime () также значительно больше, чем предыдущие времена между кадрами (значительная разница составляет 2-3 мс).
Edit2: я думаю, что нашел решение благодаря http://gafferongames.com/game-physics/fix-your-timestep/. Установите фиксированное дельта-время вместо использования GetFrameTime.