2D-Grafik Gezielter Repaint einzelner Frames in Java-Game

plexus

Mitglied
Hallo zusammen,
ich werde die nächste Zeit viel mit Java zu tun haben und habe mich jetzt endlich 'mal hier angemeldet. :)

Zum Problem:
Ich programmiere momentan ein Plattformer-Spiel auf Basis von Vektor(svg)-Grafiken. Als unterstützende Library verwende ich Batik. Wärend des Spielverlaufes verschiebe ich logischerweise Spielfiguren, als auch mehrere Hintergrundebenen. Diese Elemente basieren alle auf dem JSVGCanvas (erbt von java.awt.Container) und stellen jeglichen SVG-Content dar.

Verschiebe ich eine Ebene, so wird diese aufgrund dieser Änderung neu gezeichnet:
Java:
Container.setLocation(point);
Außerdem zeichnet sich dadurch wohl auch der ganze JFrame neu, da jeder dieser Container ein component des JFrames ist.

Da ich in jedem Frame mehr als ein Objekt verändere, wird meines erachtens nach viel zu oft alles neu gezeichnet, was zu Performance-Problemen führt.

Ich hatte nun deshalb den Ansatz verfolgt, die Container nicht dem JFrame hinzuzufügen, sondern pro Frame einmal "per Hand" in den Buffer zu zeichnen:
Java:
BufferStrategy buffer = this.frame.getBufferStrategy();
buffer.getDrawGraphics();

Hier komme ich jetzt überhaupt nicht mehr weiter. Best-Practice für das Zeichnen in den Buffer ist wohl
Java:
mySprite.draw(g); // g = Buffer-Graphic
allerdings besitzt weder der JSVGCanvas noch ein AWT-Container die draw-Funktion.

Ich bin mir sicher, dass ich hier einen grundlegenden Denkfehler habe. Würde mich freuen wenn mich jemand in die richtige Richtung weisen könnte. :)
 

plexus

Mitglied
Nachtrag: Ich verstehe auch nicht warum ich in jedem fall die paint() des JFrames überschreiben muss. Zeichnet sie sonst gar nichts? Außerdem möchte ich ja auch nicht direkt aufs Frame zeichnen sondern in dessen Buffer.

Bis dato hat es auch wunderbar funktioniert die Elemente als components auf das JFrame zu legen und auf diesem immer wieder repaint() aufzurufen. Nur eben meine ich so Performance zu verschwenden.
 

jgh

Top Contributor
aber warum rufst du repaint auf den JFrame auf und nicht auf die JSVGCanvas direkt?

Grundsätzlich könnte es aber auch ein Problem damit geben, dass du Swing und AWT Elemente vermischt.
Da deine Klasse auch JSVGCanvas heißt, bietet sich imho eher an, einen Frame anstelle des JFrame zu nutzen.

BufferStrategy kenne ich leider zu wenig, um dazu was sagen zu können.
 

Runtime

Top Contributor
Ich empfehle dir ein AWT Frame zu nehmen, setIgnoreRepaint(true) vor dem erstellen der Buffer-Strategy aufzurufen und das Canvas (wenn möglich ohne Fehler) dem Fenster nicht hinzuzufügen. Die einzelnen Frames kannst du dann jeweils über
Code:
mySprite.[B]paint[/B](g)
mit der Buffer-Graphics in den Buffer zeichnen.
 

plexus

Mitglied
Vielen danke für eure Hinweise, hat mich in die richtige Richtung geschubst und kann nun jeden Layer per Hand in den Buffer zeichnen. Lediglich mein HUD (JComponent mit einem JLabel) möchte sich aus irgendeinem Grund noch nicht zeichnen lassen. :confused: Falls dazu noch jemand eine Idee hat würde ich mich freuen. :)

Ich hatte kurz auf ein AWT-Frame umgestellt, dies jedoch wieder geändert. Wenn ein JSVGCanvas auch eine Swing Componente ist, ist es doch besser beim Frame auch bei Swing zu bleiben? Wieso sollte es besser sein einen AWT-Frame zu nehmen? :confused: Hoffe ich überseh hier nichts.

Der Vollständigkeit halber hier der Paint-Code im GameLoop:

Java:
// Draw all layers into buffer
BufferStrategy buffer = this.frame.getBufferStrategy();
Graphics2D g = null;
try
{
	g = (Graphics2D)buffer.getDrawGraphics();
	// Don't draw beneath window-borders when in windowed mode
	if (!ConstantsModel.fullscreen)
	{						
		Insets windowBorder = frame.getInsets();
		g.translate(windowBorder.left, windowBorder.top);
	}
	
	// Draw every layer
	for (JComponent pane : this.panes)
	{	
		// Don't draw the hit-pane.
		if (pane.getName() != null && ( pane.getName() == "hit"))
		{
			continue;
		}
		
		// paint into buffer
		pane.paint(g);
	}
	
	// Draw HUD on top
	this.HUD.paint(g);
}
finally
{
	g.dispose();
}

// Show drew buffer-frame
buffer.show();
 
Zuletzt bearbeitet:

Runtime

Top Contributor
Das JSVGCanvas erbt ja von java.awt.Container, es ist also eine AWT-Komponente, zudem hat das JFrame noch ein Root-, Glass- und LayeredPane. Wenn du ein Spiel programmieren willst, rate ich dir sowieso von Swing & AWT Controls ab. Besser ist es, ein Interface Paintable mit der Methode paint(Graphics2D g) erstellst und alle grafischen Objekte dieses implementieren. Quaxli hat dazu ein Tutorial geschrieben.
 

plexus

Mitglied
Oh shit, wie ist mir denn das passiert. Der Pfad zu JSVGCanvas sieht so aus: "org.apache.batik.swing.JSVGCanvas;"
Autsch, entschuldige. :(

Ansonsten vielen Dank wiedermal. Werde mich mal dem Tutorial widmen. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben