Double-Buffering zu langsam

Status
Nicht offen für weitere Antworten.
J

JeffChef

Gast
Tach erstmal,

hab dieses Forum bei Google gefunden und hoffe ihr könnt mir helfen.

Es geht ums Double-Buffering bei Java. Funktioniert alles super, nur macht es mein Programm
extrem langsam.

Code:
Graphics bufferGraphics;
Image offscreen;

offscreen = createImage(800, 600);
bufferGraphics = offscreen.getGraphics();

public void paint(Graphics g){
	bufferGraphics.drawImage(nbg, 0, 0, this);
	..
	g.drawImage(offscreen, x, y, this);
	..

Das ist jetzt so langsam, das alle Animationen in Zeitlupe ablaufen.
Gibts nicht ne möglichkeit für Flackerfreie Animationen die auch
normal laufen?

Vielen Dank

Mfg

Jeff
 

Ark

Top Contributor
Double Buffering allein wird wohl nie Schuld daran sein, dass etwas zu langsam ist. Soll heißen: Wir brauchen mehr Code, wenn wir dein Problem beheben wollen.

Außerdem ist die Art und Weise des Aufrufs von repaint-Methoden auch entscheidend. Auch die richtige Verwendung von Threads gibt viel her.

MfG
Ark
 
G

Guest

Gast
Nagut, ich werde mal versuchen das Problem zu beschreiben.
Es geht um einen Ball der in einer 2D-Umgebung umher springt.

Die Fläche ist 1024x768 groß. Es befinden sich noch andere Objekte in der Umgebung,
auf die der Ball treffen kann und so reflektiert wird.

Code:
Graphics bufferGraphics;
Image offscreen;
offscreen = createImage(programSizeX, programSizeY);
bufferGraphics = offscreen.getGraphics();
bufferGraphics.fillRect(0, 0, programSizeX, programSizeY);
repaint();

public void paint(Graphics g){
	// Lösche alte Position des Balles und des Reflektors
	bufferGraphics.setColor(new Color(0, 0, 0));
	bufferGraphics.fillRect((int)(nBall.getPunkt().getPosX()), 				
             (int)(nBall.getPunkt().getPosY()), nBall.getSize(), nBall.getSize());
	bufferGraphics.fillRect((int)(nReflekt.getPunkt().getPosX()), 
             (int)(nReflekt.getPunkt().getPosY()), 
	     (int)(nReflekt.getSizeX()), (int)(nReflekt.getSizeY()));
	    
	updatePositions();
	    
	bufferGraphics.setColor(new Color(255, 255, 255));
	bufferGraphics.fillRect((int)(nBall.getPunkt().getPosX()),
             (int)(nBall.getPunkt().getPosY()), nBall.getSize(), nBall.getSize());
	    
	// Zeichne den Reflektor
	bufferGraphics.setColor(new Color(255, 255, 255));
	bufferGraphics.fillRect((int)(nReflekt.getPunkt().getPosX()), 		
             (int)(nReflekt.getPunkt().getPosY()), 
	     (int)(nReflekt.getSizeX()), (int)(nReflekt.getSizeY()));
	    
        g.drawImage(offscreen, programStartPointX, programStartPointY, this); 
        repaint();
}

Das Problem liegt bei dem Double-Buffering. Ohne ist es so schnell, das ich
den Programmablauf mit thread.sleep verlangsamen musste, um überhaupt was zu erkennen.

Habe meinen Code schon "schneller" bekommen. Anstelle den ganzen Bildschirm zu überschreiben,
überschreibe ich jetzt nur noch die alten Positionen der geänderten Objekte.

Viel hilft es aber nicht. Ist immernoch Zeitlupe.. von der flimmernden Version ohne Double-Buffering ist es weit weit entfernt.
 

Ark

Top Contributor
Meiner Ansicht nach sind paint- und paintComponent-Methoden gerade die Performanzkiller, wenn sie schlecht programmiert sind. Darum sollte man

a) das Rendering in einen Thread auslagern
b) nur das neu zeichnen, was wirklich notwendig ist (der Bereich muss natürlich leicht zu berechnen sein ;) )
c) so viele Informationen wie möglich so weit wie möglich komplett berechnet puffern (d. h. auch so wenig Objekte erzeugen oder Methoden aufrufen wie möglich)
d) alle Farbinformationen bzw. Bilder so speichern, dass sie mit allen Farbräumen und Farbmodellen kompatibel sind
e) direkt auf Raster schreiben, wenn möglich
f) überhaupt nur so viel wie nötig und so wenig wie möglich zeichnen (d. h. auch nicht häufiger als unbedingt notwendig Bereiche mehrfach zeichnen)
g) setDoubleBuffered(boolean) und setIgnoreRepaint(boolean) so sinnvoll wie möglich einsetzen.

Gehe einfach mal alle genannten Punkte durch und entferne unbedingt den repaint()-Aufruf am Ende von paint()!!!

MfG
Ark
 

L-ectron-X

Gesperrter Benutzer
Das Ganze ist auch verkehrt aufgezogen.
Beim DoubleBuffering wird die Hauptarbeit in der update()-Methode gemacht, die ich bei dir nicht sehe.
In der update()-Methode werden die Grafik-Objekte in einem Offscreen-Speicherbereich (quasi im Hintergrund) vorbereitet und auf ein Offscreen-Immage gezeichnet. In der letzten Zeile der update()-Methode wird dann das Offscreen-Immage auf den Bildschirm kopiert.
Die paint()-Methode besteht hier selten aus mehr als 3 Zeilen. Die hat die Aufgabe nur zu zeichnen, es sollten dort keine vorbereitenden Berechnungen gemacht werden.

Zu diesem Thema gibts (auch von mir) reichlich (ausführbaren) Beispielcode.
Bitte dazu mal die Forumsuche benutzen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Applet Double Buffering AWT, Swing, JavaFX & SWT 2
T 2D-Grafik Double Buffering AWT, Swing, JavaFX & SWT 7
lumo SWT Double Buffering AWT, Swing, JavaFX & SWT 5
K Flackern trotz Double-Buffering AWT, Swing, JavaFX & SWT 10
hdi Wie implementiere ich Double Buffering AWT, Swing, JavaFX & SWT 12
G Frage zu Double Buffering AWT, Swing, JavaFX & SWT 4
U Double Buffering AWT, Swing, JavaFX & SWT 6
L Double-Buffering AWT, Swing, JavaFX & SWT 2
D double Buffering abschalten? AWT, Swing, JavaFX & SWT 4
L Double Buffering bei JTable AWT, Swing, JavaFX & SWT 4
CptK Point2D.Double Kurven - Beschriftung und richtiges Anklicken AWT, Swing, JavaFX & SWT 7
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
B AWT GUI nimmt nur 19 Ziffern an, obwohl Max Wert von Double größer ist AWT, Swing, JavaFX & SWT 7
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
S Polygon mit double-Koordinaten AWT, Swing, JavaFX & SWT 2
N Double Buffern von BILDERN AWT, Swing, JavaFX & SWT 6
B Graphics2d drawString mit double Werten? AWT, Swing, JavaFX & SWT 5
O 2D-Grafik Rectangle mit double Werten zeichnen AWT, Swing, JavaFX & SWT 3
M Object[][] in double[][] casten AWT, Swing, JavaFX & SWT 6
A aus einem Textfeld in double parsen AWT, Swing, JavaFX & SWT 10
J JSlider mit Double Werten AWT, Swing, JavaFX & SWT 5
T JTextField nur Double werte eingeben AWT, Swing, JavaFX & SWT 2
A Explicit casting Point2D.Double AWT, Swing, JavaFX & SWT 3
A TableRowSorter für double Werte mit Formatierung AWT, Swing, JavaFX & SWT 3
iLoveTheInternet AWT Rectangle2D.Double intersecs AWT, Swing, JavaFX & SWT 6
R drawString mit double Koordinaten AWT, Swing, JavaFX & SWT 5
L JTextField Umwandeln in double-Werte AWT, Swing, JavaFX & SWT 5
K double / int einlesen? AWT, Swing, JavaFX & SWT 12
L double in JTable formatieren AWT, Swing, JavaFX & SWT 7
P Integer, Double, etc mit getTableCellRendererComponent AWT, Swing, JavaFX & SWT 6
P Double-Werte sortieren mit TableRowSorter AWT, Swing, JavaFX & SWT 2
B JFormattedTextField mit DecimalFormat in ein Double AWT, Swing, JavaFX & SWT 11
S double in String umwandeln AWT, Swing, JavaFX & SWT 6
R Double in der Tabelle statt String und Integer AWT, Swing, JavaFX & SWT 3
Student "Dicke" einer Linie - Line2D.Double AWT, Swing, JavaFX & SWT 12
G Double-Click f. alle Komps UNIX u. WIN verschieden ? AWT, Swing, JavaFX & SWT 5
G Ellipse2D.Double funktioniert nicht AWT, Swing, JavaFX & SWT 3
W SWT - Tree: Problem mit Double-Click expand AWT, Swing, JavaFX & SWT 5
K AWT flackern trotz buffering AWT, Swing, JavaFX & SWT 4
D graphische Ausgabe zu langsam (vsync gzielt abschaltbar?)... AWT, Swing, JavaFX & SWT 13
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
Tommy135 JFileChooser ist sehr langsam AWT, Swing, JavaFX & SWT 13
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
L [Slick2d] Sidescroller/Hintergrundbild sehr langsam AWT, Swing, JavaFX & SWT 3
S Swing JtextPane sau langsam AWT, Swing, JavaFX & SWT 15
P JFrame langsam / seltsames Verhalten AWT, Swing, JavaFX & SWT 6
X JInternalFrame vor Java2D-Zeichnung langsam bzw. Gui friert ein AWT, Swing, JavaFX & SWT 1
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
M JTable mit wechselnden Spalten - sehr Langsam AWT, Swing, JavaFX & SWT 5
A HELP: JFieldText dynamisch setzen -> langsam AWT, Swing, JavaFX & SWT 19
O RandomAccesFile langsam AWT, Swing, JavaFX & SWT 6
lumo AWT Screenshots machen ist langsam? AWT, Swing, JavaFX & SWT 6
P 2D-Grafik g2.drawImage() langsam AWT, Swing, JavaFX & SWT 110
J JApplet langsam wegen vielen Tooltips? AWT, Swing, JavaFX & SWT 36
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
F Swing JTable langsam AWT, Swing, JavaFX & SWT 13
Kr0e VolatileImage langsam AWT, Swing, JavaFX & SWT 10
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
A Swing JTextPane sehr langsam AWT, Swing, JavaFX & SWT 6
R TableRowSorter... zu langsam AWT, Swing, JavaFX & SWT 9
Stillmatic JTextPane langsam? AWT, Swing, JavaFX & SWT 5
R JTable für sehr viele Daten sehr langsam AWT, Swing, JavaFX & SWT 20
PAX JList aktualisiert zu langsam beim Hinzufügen von Einträgen AWT, Swing, JavaFX & SWT 6
G JScrollPane scrollt zu langsam AWT, Swing, JavaFX & SWT 6
S Bilder werden sehr langsam geladen AWT, Swing, JavaFX & SWT 4
M jFileChooser extrem langsam AWT, Swing, JavaFX & SWT 15
G Swing Programmstart zu langsam AWT, Swing, JavaFX & SWT 3
J JFileChooser öffnet sich in manchen Fällen extrem langsam! AWT, Swing, JavaFX & SWT 12
D Scrollbalken zu langsam AWT, Swing, JavaFX & SWT 10
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
doctus img.getScaledInstance() sehr rechenintensiv und langsam? AWT, Swing, JavaFX & SWT 3
T Linie langsam zeichnen AWT, Swing, JavaFX & SWT 3
C JButton + JFrame Reaktion SEHR langsam. AWT, Swing, JavaFX & SWT 2
A Warum ist jtable.addRowSelectionIntervall so langsam? AWT, Swing, JavaFX & SWT 10
T Swing bei Realtime-Aktualisierung zu langsam? AWT, Swing, JavaFX & SWT 10
C TreeModel zu langsam für EventDispatchThread AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben