2015-04-15 3 views
1

Чтобы все было ясно, я ищу наилучшую альтернативу реализации «игрового цикла» на Java (с использованием Swing).Лучшая практика Java-игры Swing '

В настоящее время я использую следующие настройки с paintComponent() преодолено в JPanel классе для рисования такие вещи, как так:

public void run() { 
    while (running) { 
     panel.update(); 
     panel.repaint(); 
     try { 
      sleep(SLEEP_TIME); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

Эта установка, кажется, работает аккуратно, но перемещение формы и образы, кажется, заикается для пиксель или два раза. Другими словами, движение не так гладко, как хотелось бы.

Мне интересно, есть ли способ сделать игровой цикл более эффективно, i.e., чтобы избежать заикания в движении?

+0

Установить скорость цикла. – Bubletan

+0

И как мне это сделать? – noobcoder

+0

Какова ценность 'SLEEP_TIME'? Качели обычно могут достигать очень высокой частоты кадров. Заикание, вероятно, связано с тем, что ваша программа была написана, и небольшой образец, который вы предоставили, недостаточно для определения проблемы. См. Http://stackoverflow.com/help/mcve – Radiodef

ответ

1

Простой способ зафиксировать скорость цикла, использует ScheduledExecutorService.

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
executor.scheduleAtFixedRate(() -> { 
    panel.update(); 
    panel.repaint(); 
}, 0, 16, TimeUnit.MILLISECONDS); 

Другой способ - сделать это самостоятельно, вычислив время сна, основанное на времени, используемом для процесса.

public void run() { 
    long time = System.currentTimeMillis(); 
    while (running) { 
     panel.update(); 
     panel.repaint(); 
     long sleep = 16 - (System.currentTimeMillis() - time); 
     time += 16; 
     try { 
      sleep(sleep); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 
Смежные вопросы