Не существует идеального способа справиться с этим, потому что вы никогда не сможете точно «предсказать», сколько времени будет потрачено, пока изображение, которое вы отображаете, на самом деле не отобразится.Что вы можете сделать, это измерить время, прошедшее между предыдущим и текущим тиками.
delta time = current tick time - last tick time
Это дает вам фактическое время дельты , которое прошло.Итак, как вы получаете время тика?Я считаю, что в Java классы Clock, System и Timer предоставляют различные функции, каждая из которых имеет разную точность и детальность.Как правило, некоторые из этих функций зависят от аппаратных часов, некоторые могут быть прерваны различными программными и аппаратными событиями, некоторые испытывают проблемы, когда переключение контекста происходит с несколькими аппаратными ядрами, некоторые могут даже запускаться задом наперед. Это зоопарк, и вам нужно прочитатьДокументы внимательно, чтобы понять, что вы на самом деле измеряете.Однако, как правило, точность в миллисекундах вполне достаточна для большинства приложений.Например, это дает вам время в секундах (как удвоение с достаточной точностью для миллисекундных диапазонов).
double stime = System.currentTimeMillis();
Скорость обычно выражается в виде расстояния на единицу времени, например
meters per second (m / s)
Затем вы можете рассчитать расстояние, на которое объект должен пройти, умножив прошедшее время на скорость дельты.
delta object movement = delta elapsed time * speed
Если вы хотите замедлить движение ваших объектов, вы уменьшите скорость.
Если у вас очень «стабильная» частота кадров системы (и если вы используете стандартную двойную буферизациюэто в основном так), вы можете согласиться с разницей между последними 2 тиками, но, конечно, вы можете использовать разные схемы прогнозирования, чтобы попытаться предвидеть замедления, если у вас огромные всплески обработки с нерегулярными интервалами.Получение предсказуемой частоты кадров - вот почему делать хорошие игры все еще сложно.