[英]Java Swing - loading graphics in the background
我有一個程序,它只是一個繪制某些內容的窗口(無計算,無與用戶的交互等)。 該程序的主JPanel具有相當復雜的paintComponent函數-執行大約需要5到10毫秒。
我設置了一個Timer,每25毫秒調用一次TimerTask。 該TimerTask只是在面板上調用repaint()。 這樣,程序應具有40 FPS。
但是面板的paintComponent方法執行大約需要5到10毫秒。 由於某些原因,Timer等待TimerTask的run()方法完成(這意味着它等待面板重新繪制)。 這樣,它不會每25毫秒重新繪制一次,而是每30-35毫秒重新繪制一次,從而導致不穩定和不良的FPS。
顯然,我希望在后台執行計算-現在程序只執行繪圖,然后空着等待25 ms,而不是執行繪圖並僅等待剩余時間。
我嘗試使用swing.Timer而不是util.Timer,但沒有用(是相同的)。
我嘗試使用兩個單獨的計時器,一個用於在BufferedImage上繪制圖形,另一個用於將BufferedImage放置在JPanel上。 從性能角度來看,這要好一些,但會閃爍。
那么如何真正在后台繪制圖形呢?
答案就是最好的方法。
在背景中繪制。
您需要將圖形渲染到單獨的圖像上,然后只要JPanel請求,就可以將該圖像渲染到JPanel上。
但是,解決方案的一個問題是靜態睡眠。 您可能想創建一個新線程。 該線程將負責渲染到圖像上。 然后,根據經過了多少時間,也需要為剩下的時間入睡。
private final BufferedImage render = new BufferedImage(screen_width, screen_height, BufferedImage.TYPE_RGB);
public void run(){
final long start = System.nanoTime();
renderGraphicsOnto(render.getGraphics());
final renderTime = System.nanoTime() - start;
try {
Thread.sleep(25 - renderTime / 1000000); // convert to milliseconds
} catch(final Exception ignored){
}
}
這只是有關如何實現此目標的一個小例子。 javax.swing.Timer
或java.util.TimerTask
提供的任何形式的靜態睡眠都無法實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.