2D-Grafik Double Buffering

Trunk

Mitglied
Hallo!

Da die auf einem JPanel gezeichneten GIF's in meinem 2D-Spiel beim bewegen leicht flimmern, versuche ich noch schon eine Weile Double Buffering umzusetzten, aber irgendwie will das nicht so recht klappen.

Natürlich habe ich schon viel gegoogelt und auch hier im Forum die Suchfunktion benutzt, ich konnte jedoch nun noch nicht herausfinden, wie man in meinem Beispiel am besten vorgeht.

In der Main Methode des Programms wird zunächst ein neues "Frame" erzeugt, in welches dann eine von JPanel erbende Klasse "World" gesetzt wird.

Java:
public class Frame extends JFrame{


	
	public Frame(){
        new JFrame();
        add(new World(1920,1920,this));
        setTitle("2-D Test Game");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800,600);
        setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false);

}

In der Klasse "World" wird regelmäßg repaint(); ausgeführt. Stark vereinfacht läuft es auf folgendes hinaus:

Java:
 @Override
	    public void paintComponent(Graphics g) {
	        super.paintComponent(g);


	    		TestObject1.drawObjects(g);
	                AnotherObject.drawObjects(g);
	        
	    }

Innerhalb des Objectes gibt es nun folgende Methode (stark vereinfacht):

Java:
	    public void drawObjects(Graphics g) {
	    	
	    	calcRotation();
	    	Graphics2D g2d = (Graphics2D)g.create(); 
	    	g2d.rotate(Math.toRadians(rotation), x, y);
	        g2d.drawImage(image,x,y, null);
	        
	    }

Meine Frage nun: Wie lässt sich in diesem Beispiel nun am besten Double Buffering umsetzten?

Danke!
 

L-ectron-X

Gesperrter Benutzer
In Swing brauchst du das DoubleBuffering nicht mehr selbst schreiben, es ist bereits drin und aktiviert.
Wenn etwas flackert oder flimmert, hast du einen grundlegenden Programmierfehler drin.

Bspw. erbt dein Frame von JFrame...
Wenn du nun aber nur
Code:
java.awt.*
importiert hast, kann es da schon zu Problemen kommen.
Faustregeln:
-Niemals eigene Klassen so benennen, wie die Klassen aus der Java-Bibliothek.
-Vermeide Mischung von AWT- und Swing-GUI-Komponenten.
-Vermeide die Benutzung von getGraphics(), es wird in 99% der Fälle nicht nötig sein.

Code:
setVisible(true);
sollte immer die letzte Anweisung im Konstruktor einer Fenster-Klasse sein.
 

Trunk

Mitglied
Wenn ich nun allerdings in meinem JFrame eine Zeile hinzufüge
Code:
(CreateBufferStrategy(2);)
dann hilft dass schon, und das gröbste Flickern verschwindet.
Mir war zwar klar, dass das vermischen von AWT und Swing nicht empfehlenswert ist, und ich weiß auch dass das wahrscheinlich der Grund ist wieso überhaupt was flackert, aber ich weiß ehrlich gesagt nicht wie sich das vermeiden lässt.

Java:
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Point;

So brauche ich zB diese drei Importe, um 1. den Cursor zu ändern, 2. ein Graphics Objekt in der PaintComponent() übergeben zu können und 3, um einen Punkt mit x,y zu bestimmen. Was wären die Swing Äquivalente, gibts welche?

Dasselbe gilt für diese:

Java:
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.image.BufferedImage;

import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
 

L-ectron-X

Gesperrter Benutzer
Alles, was du mit den Graphics-Methoden innerhalb der paintComponent()-Methode auf ein JPanel zeichnest sind keine Components. Das braucht auch nicht mehr doppelt gepuffert werden.
 

Trunk

Mitglied
Alles, was du mit den Graphics-Methoden innerhalb der paintComponent()-Methode auf ein JPanel zeichnest sind keine Components. Das braucht auch nicht mehr doppelt gepuffert werden.

Hm, nur dann stellt sich mir die Frage, wieso einiges an Flimmern verschwindet, sobald ich CreateBufferStrategy(2); an ende des JFrame Konstruktors setzte :bahnhof:
Also wird doch irgendwas doppelt gepuffert? ???:L
 

L-ectron-X

Gesperrter Benutzer
Ich weiß nicht, was du machst. Fakt ist, du brauchst dein Zeichnen nicht puffern, das wird von Swing bereits erledigt.
Schau mal hier unter "M" nach. Dich dürften die 3 Themen mit Malen interessieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Applet Double Buffering AWT, Swing, JavaFX & SWT 2
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
J Double-Buffering zu langsam AWT, Swing, JavaFX & SWT 4
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

Ähnliche Java Themen

Neue Themen


Oben