Java/Tutorials/Double Buffering

Aus Scientia
Version vom 8. April 2011, 14:16 Uhr von Alexis Hiemis (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Was ist Double Buffering?

Double Buffering beschreibt eine Methode um Flackern zu beseitigen, die in der paint() Methode durch direktes Zeichnen von grafischen Objekten(Linien, Kreise, Bilder) verursacht wird. Dabei wird nicht direkt auf das grafische-Element, wie z.B. JPanel, gezeichnet, sondern in einen temporären Bild und anschließend wird das Bild in der paint() Methode gezeichnet. Dies ist aber schlechtes Double Buffering. Um wirklich das Flacker zu beseitigen, muss noch die Methode update() implementiert werden.

Beispiel 1 AWT

public class DBBeispiel extends Panel
{
	int imgWidth=640;
	int imgHeight=480;
 
	//Auf diesen Bild wird dann gezeichnet
	Image offscreen;
 
	//Dies ist die Grafik Device des Bildes(Image offscreen),
	//worauf man einfach zeichnen kann.
	Graphics bg; 
 
	public DBBeispiel()
	{
		//erstellt ein Bild von der gr\u00f6\u00dfe imgWidthximgHeight,
		//in unseren Beispiel also 640x480		
		offscreen = createImage(imgWidth,imgHeight);
 
		//Nun holen wir uns die Grafik Device um auf den Bild Zeichnen zu können
		bg = offscreen.getGraphics();
	}
 
 
	public void paint(Graphics g) {
		//Als erstes muss der bestehende Inhalt geleert werden
		bg.clearRect(0,0,dim.width,dim.width);
 
		//nun  Zeichnen wird auf das Bildes, über die Graphics-Schnittstelle
		//unbeding darauf achten das es wirklich die Graphics-Schnittstelle des Bildes ist!
		bg.drawLine(0, 0, 100, 100); 
 
		// Das Bild wird dann in einen ruck gezeichnet, und wie man erkennt ohne Flackern
		g.drawImage(offscreen,0,0,this);
	}
 
	//Die Methode update() muss ebenfalls implementiert werden, ansonsten könnte 	
	//es weiterhin Flackern
	public void update(Graphics g)
	{ 
		paint(g); 
	}
}

Beispiel 2 Swing

Sun hatte das Problem bereits selbst erkannt und liefert mit Swing gleich, eine solche Methode mit. Alles was man hier nur noch machen braucht ist die Methode setDoubleBuffered() aufzurufen und auf true zu setzen.

public class DBBeispiel extends JPanel
{
	public DBBeispiel()
	{
		//wird zwar standardmaessig gesetzt, sicher ist aber sicher
		setDoubleBuffered(true);
	}
 
	public void paintComponent(Graphics g) {
		g.drawLine(0, 0, 100, 100); 
	}
 
}