Изменение скорости игры Slick2D

#java #performance #game-engine #slick2d

#java #Производительность #игровой движок #slick2d

Вопрос:

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

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

Я попробовал * с помощью delta (который отслеживает частоту обновления, я думаю!) Для моего значения, которое перемещает фон, но поскольку это не даст мне точного значения, я могу использовать для сброса фона в левую сторону (2 перемещения фона справа налево. левая рука переходит вправо на -800 пикселей).

Что является причиной этого и как мне это преодолеть?

Спасибо

Комментарии:

1. как насчет того, чтобы основывать фоновое движение на системных часах?

Ответ №1:

Вот кое-что для вас (кстати, есть сайт StackExchange, ориентированный на gamedev):

Один из наиболее важных моментов в этих статьях заключается в том, что вещи движутся с определенной скоростью С течением ВРЕМЕНИ, а не за определенное количество кадров. Поскольку частота кадров может непредсказуемо меняться, перемещение по времени и по кадрам не эквивалентны друг другу.

И вот некоторое объяснение…

Таким образом, ваш компьютер и ОПЕРАЦИОННАЯ система являются многопоточными, и, таким образом, вы никогда не сможете узнать, что происходит за пределами вашего приложения и какова общая нагрузка на компьютер. Из-за этого, даже когда вы находитесь в полноэкранном режиме, вы не получаете эксклюзивного доступа к процессору. Итак, это один из факторов, объясняющих, почему все ускоряется и замедляется.

Цель дельты в Slick2D — позволить вам справиться с этим ускорением / замедлением и позволить вашему приложению динамически изменять частоту кадров, чтобы воспринимаемое движение на экране не менялось из-за нагрузки на ваш компьютер. Дельта — это не частота обновления монитора (которая является постоянной); дельта — это количество миллисекунд, прошедших с момента последнего вызова update .

Итак, как вы правильно используете эту дельту? Допустим, ваш фон должен перемещаться со скоростью 100 пикселей в секунду. Если дельта (при заданном вызове update ) составляет 33 миллисекунды, то при этом обновлении необходимо переместить фон на величину 100*(33/1000.0) = 0.033 — таким образом, вы переместили бы фон на 0,033 пикселя. Это может показаться странным, и вы можете задаться вопросом, какой смысл перемещать <1 пикселя, но придерживайтесь меня.

Во-первых, причина, по которой вы должны разделить его на 1000,0 вместо 1000, заключается в том, что вы хотите, чтобы движение дельты давало вам число с плавающей запятой.

Вы заметите, что 2D-графика в Slick2D использует значения с плавающей запятой для отслеживания размещения объектов. Это потому, что если дельта говорит вам переместить что-то на 0,033 пикселя, вам нужно переместить его на 0,033: не на 0 и не на 1 пиксель. Перемещение субпикселей также имеет решающее значение для сглаживания увеличения / уменьшения частоты кадров, потому что совокупный эффект от нескольких перемещений субпикселей заключается в том, что в нужный момент все эти небольшие движения складываются в целый пиксель, и это совершенно плавно, что приводит к правильному общемускорость перемещения.

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

Комментарии:

1. Извините за плохую грамматику в первоначальном ответе. Я довольно часто приводил его в порядок.

2. Я не знаю, как отблагодарить вас за эту информацию! Очень легко понять. И я не заметил никаких грамматических ошибок, так что не волнуйтесь! И когда я сказал «частота обновления», я имел в виду, когда в последний раз вызывалась функция Update(), я просто не знал, как это сформулировать. Спасибо миллионному человеку.