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

StackOverflow https://stackoverflow.com/questions/2201241

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

 // 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();
 }

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top