簡體   English   中英

Java Swing-在后台加載圖形

[英]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.Timerjava.util.TimerTask提供的任何形式的靜態睡眠都無法實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM