2015-11-02 3 views
-1

Каков наилучший способ обновления экрана каждый интервал времени t для графики? Предполагая, что метод update вызывается с update(), и все фактические графические материалы происходят там и уже обрабатываются и все.Обновление графики на интервале

Я использовал javax.swing.Timer, который запускает событие действия за определенный промежуток времени для запуска моих методов обновления в прошлом, однако скорость компьютера по-прежнему остается фактором. Поэтому, если я делаю это наилучшим образом (что я сомневаюсь), как я могу оставить обновление до времени?

ответ

1

Системные вызовы часов в Java не обязательно супер точные. Вот один из способов учесть время обновления в ожидании указанного периода.

В этом примере мы обновляем каждые 40 миллисекунд или 25 кадров в секунду.

package com.ggl.testing; 

public class TimerRunnable implements Runnable { 

    private static final long interval = 40L; // 40 milliseconds 

    @Override 
    public void run() { 
     long startTime = System.currentTimeMillis(); 
     while (true) { 
      update(); 
      long endTime = System.currentTimeMillis(); 
      long elapsedTime = endTime - startTime; 
      elapsedTime = Math.max((interval - elapsedTime), 5L); 
      sleep(elapsedTime); 
      startTime = System.currentTimeMillis(); 
     } 
    } 

    private void sleep(long interval) { 
     try { 
      Thread.sleep(interval); 
     } catch (InterruptedException e) { 

     } 
    } 

    private void update() { 

    } 

} 

Мы видим, сколько времени требуется для выполнения метода обновления. Мы вычисляем прошедшее время и убедитесь, что интервал минус прошедшее время не опускается ниже 5 миллисекунд. если для обновления потребуется более 35 миллисекунд, мы понизим частоту кадров, чтобы не отставать.

+0

Чтобы уточнить, будет ли класс, подобный javax.swing.Timer, все равно следовать последовательному исполнению, а не потоку actionPerformed? И если да, то каковы предположения о потоке метода обновления, а не о том, что вы предложили? –

+0

@ Джаред Масса: Я никогда не использовал javax.swing.Timer, так что кто-то еще должен будет ответить на ваши вопросы. Я использую классы Runnable для своих анимаций. –

Смежные вопросы