Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig

P@u1

Aktives Mitglied
Hallo zusammen,

ich benutze ein BufferedImage, dass in der repaintComponent-Methode auf den Bildschirm gemalt wird.
Eben habe ich gelesen, dass man den Berech, der "beschädigt" wurde abfragen kann und dann nur das neuzeichnen zu braucht.
Ich hab jetzt mehrere Umsetzungen ausprobiert, bin mir aber nicht sicher, welche am besten / performantesten ist.
Also hier mal die 2 Möglichkeiten die ich versucht habe (vermutlich gibt es auch noch mehr):
Java:
protected void paintComponent(Graphics g)
	{
		Rectangle rect = g.getClipBounds();
		int x0 = rect.x;
		int x1 = rect.x + rect.width;
		int y0 = rect.y;
		int y1 = rect.y + rect.height;
		g.drawImage(img, x0, y0, x1, y1, x0, y0, x1, y1, null);
	}
Frage hierzu: diese überladene Methode von DrawImage führt ja eigentlich eine on-the-fly-Skalierung durch.
Kann man davon ausgehen, dass, wenn die Größe genau stimmt, diese Skalierung weggelassen wird und es schnell geht?

Dann noch die zweite Möglichkeit mit SubImage:
Java:
protected void paintComponent(Graphics g)
	{
		Rectangle rect = g.getClipBounds();
		BufferedImage localImage = img.getSubimage(rect.x, rect.y, rect.width,
				rect.height);
		g.drawImage(localImage, rect.x, rect.y, null);
	}

Welche Möglichkeit meint ihr ist schneller / besser?

So und jetzt noch was:
Euch ist evtl. aufgefallen, dass ich den aufruf von
Java:
super.paintComponent(g);
weggelassen hab.
Scheint auch nicht weiter schlimm zu sein.
Was sind die Vor- und Nachteile von diesem Aufruf?
Sollte man den besser drin lassen, oder ist das okay, den wegzunehmen?

Edit:
Und nochwas 😀
Ich hab bei einigen Codes gesehen, dass vor dem aufruf von drawImage g in Graphics2D gecastet wurde.
Ich vermute, dass das überhaupt nichts bringt, wenn man danach nur drawImage aufruft und keine Methoden die durch Graphics2D hinzugekommen sind.
Ist meine Vermutung richtig, oder wurde evtl. drawImage überschrieben?
 
Zuletzt bearbeitet:
Hm, ich rufe doch auf:
Java:
g.getClipBounds();

Ich dachte, der clip wäre schon automatisch (von Swing / Fenstersystem o.Ä.) gesetzt und dann wird effektiv nur das gezeichnet, was in diesem Bereich liegt, aber man könnte vorher Zeit sparen in dem man direkt nicht dort hinzeichnet und es dann nicht "rausgefiltert" werden muss, oder hab ich da was falsch verstanden?
 

Kann man davon ausgehen, dass, wenn die Größe genau stimmt, diese Skalierung weggelassen wird und es schnell geht?


Davon sollte man ausgehen können. Ob man es kann, will ich nicht beurteilen. Alles andere wäre aber ziemlich blöd...

Welche Möglichkeit meint ihr ist schneller / besser?

Zumindest ist die zweite resistenter gegen potentielle Blödheiten: Dort wird garantiert nicht skaliert 😉 IMHO sollte nicht so viel unterschied sein. Ggf. ausprobieren....?!

Was sind die Vor- und Nachteile von diesem Aufruf?
Sollte man den besser drin lassen, oder ist das okay, den wegzunehmen?

paintComponent macht auf einem JPanel afair nichts, außer den Hintergrund zu löschen. In den Bereichen, wo das Bild liegt, sollte das egal sein, in anderen Bereichen könnte es einen Unterschied machen...

Ist meine Vermutung richtig, oder wurde evtl. drawImage überschrieben?

Selbst wenn es überschrieben wurde, ändert das casten daran nichts. Wenn es NUR für diesen Aufruf gecastet wird, ist das überflüssig.
 

Neue Themen


Zurück
Oben