2015-04-15 129 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(); 
     } 
    } 
} 

這種設置似乎整齊的工作,但移動圖形和圖像好像口吃了像素或兩次。換句話說,這個運動並不像我希望的那樣流暢。

我想知道是否有辦法更有效地完成遊戲循環,避免在運動中出現口吃?

+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(); 
     } 
    } 
}