2008年3月20日 星期四

Double Buffering

在寫動畫的程式時,最常發生的問題就是畫面會閃爍了。會發生這個問題的主要原因是每一個裝置都有它的更新頻率。每隔一段時間就會重新顯示畫面,如果在這一定的時間內來不及將整個圖畫上去,就會造成只畫了部份,因此就產生了閃爍。所以,若要保證每次都在這時間內畫好整張圖,就必須將繪圖的動作與更新頻率同步。然而在短時間內能畫出的圖有限,所以通常會將圖先畫在記憶體裡,然後再一次畫在螢幕上。如此便可有效抑制閃爍。

首先,宣告一個Image來當作緩衝區。用createImage的函式來取得緩衝區的物件。呼叫getGraphics可以取得緩衝區的Graphics 物件。接著便和一般用法一樣,用drawImage將圖畫上去。例:

private Image bufferImage = null;
private Graphics bufferGraphics;
public void imageRender() {
if(bufferImage == null) {
bufferImage = createImage(WIDTH, HEIGHT);
bufferGraphics = bufferImage.getGraphics();

bufferGraphics.setColor.white);
bufferGraphics.fillRect(0, 0, WIDTH, HEIGHT);
....
}


再覆載paintComponent
public void paintComponent(Graphics g) {
super.paingComponent(g);
if(bufferImage != null)
g.drawImage(bufferImage, 0, 0, null);
}


如此便可有效抑制閃爍。此外要注意的一點就是儘量保持paintComponent()簡單。因為他可能會JVM呼叫,例如當視窗被別的遮住後又移開。

0 意見: