2016-01-12 26 views
0

在下面,我的代碼是用來製作可再生圖形的代碼,用於顯示生活遊戲本身。更新圖形時jframe閃存

public paint(Graphics g) 
{ 
    g.setClip();//Set    
    g.setColor(Color.BLACK); 

    Processing..... 

    while(true) 
    { 
      g.clearRect();//Clear 

      g.drawLine(); //Draw; 

      Calling SwingWorking to prepare next statement 
    } 
} 

看起來像這樣做很愚蠢,因爲在運行它時,幀會一直閃爍而且遲緩。 我嘗試使用Thread.sleep(),但它只是減慢閃光頻率。

所以,我的問題是如何做得好,避免閃爍。 我沒有提到的代碼部分都是關於實例變量的數據處理,如果您需要它,請注意我,非常感謝您的幫助。


感謝,@MadProgrammer

這裏是我得到了什麼, 首先,閃存是因爲當程序調用重繪()和paint(),它花費太多時間,使動畫順利,在這種情況是clearRect()和drawLine()。

我將使用雙緩衝來解決它。


更新,

謝謝你們,我讀那些例子。我只是使用一個沒有任何緩衝區方法的框架來顯示圖形,這是一個錯誤。我使用了bufferStrategy來解決它。

+2

'JFrame'沒有雙緩衝,所以我不會騎它是'塗料'的方法。 – MadProgrammer

+2

考慮提供一個[runnable示例](https://stackoverflow.com/help/mcve),它可以說明您的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的混淆和更好的響應 – MadProgrammer

+2

基於單一的,不在上下文的代碼片段,我建議您首先查看[在AWT和Swing中繪製](http://www.oracle.com/) technetwork/java/painting-140037.html),[Performing Custom Painting](http://docs.oracle.com/javase/tutorial/uiswing/painting/),[Swing中的併發](http://docs.oracle.com .com/javase/tutorial/uiswing/concurrency /)和[如何使用Swing Timers](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)瞭解一些可能的原因問題和可能的解決方案 – MadProgrammer

回答

1

不是一個答案,而是一個示範

它花費太多時間,使動畫順利

對我來說,這意味着你不明白是怎麼API的作品,你可以做一些複雜的動畫與Swing如果你把你的想法。

前一段我創建了一個「動畫序列」引擎,它採取了一系列的圖像和動畫它們的相互

此實例的俯視使用5個單獨的圖像/層(用油漆效果把在頂部)

Layers

每一層被賦予了不同的「速度」,使得它們以不同的速度通過搬出動畫的基準時間(例如,爲1的速度將導致該層僅旋轉一次超過序列的基本持續時間,在本例中爲20秒)

原始圖像都是1024x256,使得不顧尺寸

Sequence

添加ontop的的該序列是打在透明窗與所述另外的α效應(在邊緣處出血關閉) ,這不是一個簡單的動畫。

的GIF是打在粗糙8FPS,實際的動畫運行在大約200fps

(對不起,代碼是相當大的,並使用了一些其他圖書館,像計時框架,所以它的不可能發佈)

我的觀點是,這個問題是不是與API(鞦韆/ Graphics)獨自一人,而是你如何使用它

更多的例子,你可以看看:

,大部分這些例子並不甚至還試圖對任何主要優化或其他性能technqiues

你也應該看看Painting in AWT and SwingPerforming Custom Painting爲有關繪畫過程如何工作的更多細節