Движение объекта прерывисто, когда частота кадров ограничена - PullRequest
3 голосов
/ 15 октября 2010

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

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

Если я ограничу частоту кадров, скажем, 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.

1 Ответ

1 голос
/ 19 марта 2011

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

m_distance += m_speed * GetFrameTime();

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

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

m_distance += m_speed;
...