1 голос 1300 просмотров 6.09.2016 / 17:30
Death
Столкнулся с такой проблемой как FPS.Вот я делал WShooter, там у меня была проблемма с этим самым FPS, вот если я ставил паузу ври так: 1000/50, то на первых волнах было что нужно, но на следующих, где врагов больше 100, была уже тормажения приложения. А про то что когда было тысячи врагов на 500 волнах -- я уже молчу. Задал вопрос я на форму. Ответили мне простым способом как стабилизировать FPS. Получилось. Но всё 500 волны тормозили. Вот мне подсказали что можно сделать пропуск кадров. Вот тут мне вообще не приходит в голову, как это сделать. Помогите пожалуйста.
Изм. aNNiMON
от 6.09.2016 / 17:32
Ответы
6 голосов У тебя есть отрисовка (напр. метод draw()) и обработка логики (напр. метод update()). В draw ты рисуешь врагов, в update изменяешь их координаты, обрабатываешь столкновения и т.д. Упрощенно, это выглядит так:
При пропуске кадров, в момент падения FPS, мы вызываем update несколько раз, а отрисовываем один:
Вышесказанное лишь для понимания сути, теперь к коду. В принципе, здесь всё легко, сложность может возникнуть лишь в определении низкого фпс.
В elapsed будет время, затраченное на обработку одного игрового такта (время выполнения update() и draw() вместе взятых). Значение переменной lag при нормальных условиях всегда будет в пределах (0, DELAY). Немного пояснений на примере Немного пояснений на примере Мы хотим иметь 30 FPS. То есть 30 отрисовок кадра за секунду. При таком раскладе, чтобы обеспечить 30 FPS, на один игровой такт должно уходить не более 1000/30 = 33 мс.elapsed как раз и показывает, сколько времени ушло на отрисовку такта. Благодаря накопительной системе переменной lag, мы можем узнать насколько мы отстаём от заданного времени 33 мс. И делаем пропуск кадров. Разумеется, при таком подходе следует использовать двойную буферизацию, чтобы можно было рисовать из любого метода в BufferedImage. И вообще, с ней лучше. Источники: Game Loop · Game Programming Patterns (перевод: Шаблоны игрового программирования. Игровой цикл: live13)
Изм. aNNiMON
от 6.09.2016 / 18:47
1 голос Всего: 2
|
Реклама |