Я пишу моделирование в Java, посредством чего объекты действуют под ньютоновой физикой. Объекту можно было относиться к силе, он и получающаяся скорость заставляет это преодолевать экран. Природа моделирования означает, что перемещение объектов на дискретных шагах в зависимости от времени протекло между текущим и предыдущим повторением цикла анимации; например,
public void animationLoop() {
long prev = System.currentTimeMillis();
long now;
while(true) {
long now = System.currentTimeMillis();
long deltaMillis = now - prev;
prev = now;
if (deltaMillis > 0) { // Some time has passed
for (Mass m : masses) {
m.updatePosition(deltaMillis);
}
// Do all repaints.
}
}
}
Проблема возникает, если поток анимации отложен, в некотором роде заставив большое количество времени протечь (классический случай, находящийся под Windows, посредством чего нажатие и удерживание минимизируют / максимизируют, предотвращает перекрашивание), который вызывает объекты переместиться в тревожную скорость. Мой вопрос: существует ли способ определить время, проведенное в потоке анимации, а не wallclock время, или кто-либо может предложить, чтобы обходное решение избежало этой проблемы?
Моя единственная мысль до сих пор к contstrain deltaMillis
некоторой верхней границей.
Вы не думали использовать что-то вроде таймера вместо вращения в цикле?
TimerTask tt = new TimerTask(){
long prev = System.currentTimeMillis();
public void run(){
long now = System.currentTimeMillis();
for (Mass m : masses) {
m.updatePosition(now-prev);
}
prev = now;
}
}
new Timer(true).schedule(tt, 1000, 1000) ;
Таким образом, вы гарантированно получите хотя бы некоторую задержку между обновлением ваших объектов, поэтому у вас не должно быть нескольких перерисовок подряд, как в цикле while (true), и если поток задерживается, вы не получите немедленное повторное выполнение задачи из документации: «При выполнении с фиксированной задержкой каждое выполнение планируется относительно фактического времени выполнения предыдущего выполнения».
Возможно, вы захотите прочитать эту статью под названием «Java: получение времени потока с помощью ThreadMXBean».
По сути, существует класс ThreadMXBean , который позволяет узнать время, потраченное на конкретный Thread
. Я не пробовал этого, но методы (и примеры из упомянутой мною статьи) выглядят многообещающими, поэтому я думаю, что вы сможете добиться с помощью этого того, что хотите.
Я нашел javax.swing.Timer.html
особенно полезным для этого. Вот пример , который моделирует упругие столкновения между сферическими частицами и стенками контейнера.
Приложение: Этот связанный подход может помочь отделить модель от вида. Отдельный поток моделирует эволюцию системы, в то время как представление визуализирует «снимок» модели с фиксированной скоростью.
В любом случае я ограничиваю скорость, чтобы приспособиться к самой медленной целевой платформе.