Гоночная машина, машина движется быстрее на быстром компьютере - PullRequest
5 голосов
/ 04 февраля 2010

Я понимаю, почему это происходит, но я не знаю, как это предотвратить. Таким образом, сценарий таков, что каждый кадр, в котором я двигаю автомобиль на определенный заранее определенный пиксель. Что происходит, когда я работаю на медленном или быстром компьютере ... ну, я получаю меньше или больше кадров в секунду, поэтому машина движется медленнее или быстрее. Мне было интересно, как я мог предотвратить это.

Я подозреваю, что у меня возникнет та же проблема с любой библиотекой ... Я впервые делаю подобные вещи в реальном времени.

Ответы [ 8 ]

12 голосов
/ 04 февраля 2010

Я подозреваю, что ваш текущий код выглядит примерно так

 // to be called every frame
 void OnEveryFrame()
 {
     MoveCar();
     DrawCarToScreen();
 }

Но так и должно быть:

 // to be called - for example - 50 times per second:
 void OnEveryTimerEvent()
 {
     MoveCar();
 }

 // to be called every frame
 void OnEveryFrame()
 {
     LockTimerEvents();
     DrawCarToScreen();
     UnlockAndProcessOutstandingTimerEvents();
 }

Конечно, вы должны настроить соответствующее событие таймера.

10 голосов
/ 04 февраля 2010

Двигайте автомобиль в соответствии с таймерами, а не частотой кадров. модель автомобиля должна быть независимой от отображения на дисплее.

3 голосов
/ 04 февраля 2010

Вы можете решить эту проблему с помощью точных таймеров и векторной математики.

Итак, ради аргумента давайте предположим, что ваш код для рисования может быть вызван в любой момент времени, например С интервалом в 1 секунду или 3 секунды или с интервалом 0,02 секунды.

Скорость движения автомобиля должна составлять 40 пикселей в секунду.

Следовательно, количество пикселей, которое он должен переместить, составляет (TIME_NOW - LAST_FRAME_TIME) * 40 пикселей.

2 голосов
/ 04 февраля 2010

Вам нужно ограничить частоту кадров до X кадров в секунду (60 FPS является наиболее распространенным). Это общая черта в большинстве мультимедийных сред, включая SFML. Для SFML я бы посмотрел в метод Window / RenderWindow SetFramerateLimit (без знака int Limit) .

2 голосов
/ 04 февраля 2010

Считайте часы реального времени и переместите автомобиль на подходящее расстояние за прошедшее время. Это может выглядеть несколько «рывком», если компьютер работает слишком медленно, но делает скорость автомобиля независимой от скорости процессора.

2 голосов
/ 04 февраля 2010

Движение должно быть ограничено «реальной» задержкой, т. Е. Ваша машина будет двигаться со скоростью x пикселей за интервал времени.

1 голос
/ 06 февраля 2010

Вам нужно исправить ваш временной шаг . По сути, каждый кадр, на который вы перемещаете машину, зависит от того, сколько времени фактически прошло с момента последнего вызова обновления. Таким образом, вы получите правильную скорость независимо от частоты кадров.

0 голосов
/ 04 февраля 2010

Вы должны сэкономить время, прежде чем перемещать машину и чертежи.
Экономьте время после всех расчетов.
Двигай свою машину на пикселях в секунду

...