#java #performance #game-engine #slick2d
#java #Производительность #игровой движок #slick2d
Вопрос:
Я создал игру с помощью Swing, и она была немного ненадежной, поэтому я начал переделывать ее с помощью игрового движка Slick2D и столкнулся с проблемами.
Фон игры перемещается по экрану с определенным количеством пикселей при каждом вызове метода обновления. Это продолжает ускоряться и замедляться, поэтому фон будет двигаться очень быстро, а затем очень медленно и продолжает колебаться.
Я попробовал * с помощью delta (который отслеживает частоту обновления, я думаю!) Для моего значения, которое перемещает фон, но поскольку это не даст мне точного значения, я могу использовать для сброса фона в левую сторону (2 перемещения фона справа налево. левая рука переходит вправо на -800 пикселей).
Что является причиной этого и как мне это преодолеть?
Спасибо
Комментарии:
1. как насчет того, чтобы основывать фоновое движение на системных часах?
Ответ №1:
Вот кое-что для вас (кстати, есть сайт StackExchange, ориентированный на gamedev):
- https://gamedev.stackexchange.com/questions/6825/time-based-movement-vs-frame-rate-based-movement
- https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step
Один из наиболее важных моментов в этих статьях заключается в том, что вещи движутся с определенной скоростью С течением ВРЕМЕНИ, а не за определенное количество кадров. Поскольку частота кадров может непредсказуемо меняться, перемещение по времени и по кадрам не эквивалентны друг другу.
И вот некоторое объяснение…
Таким образом, ваш компьютер и ОПЕРАЦИОННАЯ система являются многопоточными, и, таким образом, вы никогда не сможете узнать, что происходит за пределами вашего приложения и какова общая нагрузка на компьютер. Из-за этого, даже когда вы находитесь в полноэкранном режиме, вы не получаете эксклюзивного доступа к процессору. Итак, это один из факторов, объясняющих, почему все ускоряется и замедляется.
Цель дельты в 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(), я просто не знал, как это сформулировать. Спасибо миллионному человеку.