Измерение времени, проведенного в приложении / поток

Я пишу моделирование в 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 некоторой верхней границей.

5
задан Adamski 14 April 2010 в 12:01
поделиться

3 ответа

Вы не думали использовать что-то вроде таймера вместо вращения в цикле?

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), и если поток задерживается, вы не получите немедленное повторное выполнение задачи из документации: «При выполнении с фиксированной задержкой каждое выполнение планируется относительно фактического времени выполнения предыдущего выполнения».

6
ответ дан 13 December 2019 в 22:04
поделиться

Возможно, вы захотите прочитать эту статью под названием «Java: получение времени потока с помощью ThreadMXBean».

По сути, существует класс ThreadMXBean , который позволяет узнать время, потраченное на конкретный Thread . Я не пробовал этого, но методы (и примеры из упомянутой мною статьи) выглядят многообещающими, поэтому я думаю, что вы сможете добиться с помощью этого того, что хотите.

1
ответ дан 13 December 2019 в 22:04
поделиться

Я нашел javax.swing.Timer.html особенно полезным для этого. Вот пример , который моделирует упругие столкновения между сферическими частицами и стенками контейнера.

Приложение: Этот связанный подход может помочь отделить модель от вида. Отдельный поток моделирует эволюцию системы, в то время как представление визуализирует «снимок» модели с фиксированной скоростью.

В любом случае я ограничиваю скорость, чтобы приспособиться к самой медленной целевой платформе.

3
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: