Animation in GlassPane: Performanceeinbruch JFrame maximiert

Status
Nicht offen für weitere Antworten.

m@nu

Bekanntes Mitglied
hallo

ich zeichne auf meiner GlassPane einen timer-gesteuerten effekt sobald der user auf einen button geklickt hat (icon der schaltfläche wird immer grösser und durchsichtiger, bis sie schliesslich ganz verschwindet ... iZoom für wen's ein begriff ist 🙂 )

funktioniert alles ganz prächtig. nur habe ich jetzt das problem, dass sobald mein JFrame maximiert ist, die animation extrem ruckelig von statten geht.
habe das clipping bereits nur auf meinen animationsbereich gelegt. hat keine änderung gebracht.

Code:
        protected void paintComponent(Graphics g) {
            if(timer != null && timer.isRunning()) {                
                Point p = SwingUtilities.convertPoint(src.getParent(), src.getLocation(), glassPane);
                int x = p.x - (cycle*stepSize)/2;
                int y = p.y - (cycle*stepSize)/2;
                int newWidth = imageWidth + (cycle*stepSize);
                int newHeight = imageHeight + (cycle*stepSize);
                float alpha = 1.0f - cycle/10f;
                
                
                
                Graphics2D g2 = (Graphics2D)g;
                g2.setClip(x, y, newWidth, newHeight);
                Image resized = image.getScaledInstance(newWidth, newHeight,
                        Image.SCALE_SMOOTH);
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
                g2.drawImage(resized, x, y, null);
            }
        }

SCALE_FAST hat ebenfalls nix geändert.
hat jemand eine idee wie ich das problem lösen könnte?

vielen dank & grüsse
m@nu
 
Ich denke mal es liegt am skalieren. Kannst du die skalierten Images eventuell schon vorbereiten das du das nicht aus dem EventDispatcher machen musst?
 
Die Graphics2D kann auch selbst noch skaliert zeichnen, vielleicht wäre es damit schneller (zumindest müsste kein neues Image erstellt werden)?
 
Wildcard hat gesagt.:
Ich denke mal es liegt am skalieren. Kannst du die skalierten Images eventuell schon vorbereiten das du das nicht aus dem EventDispatcher machen musst?
naja, wäre eine möglichkeit. das würde aber bedeuten, dass ich pro button beim laden der applikation 10 bis 11 bilder in den speicher laden müsste :? und ich bin mir noch nicht sicher, dass das alle buttons sein werden

:arrow: http://shared.msites.net/candyfeeder.png


Beni hat gesagt.:
Die Graphics2D kann auch selbst noch skaliert zeichnen, vielleicht wäre es damit schneller (zumindest müsste kein neues Image erstellt werden)?
zu beginn hatte ich das glaub'ich sogar mit der drawImage-methode gestrecht. aber leider leidet so die qualität ein wenig, und performancemässig hat sich leider nix geändert im "fenster-maximiert-modus"


hm, werd mal schauen obs am repainting der anderen komponenten in meinem JFrame liegen kann...
danke für die ideen auf jeden fall! (zusätzliche sind natürlich immernoch willkommen :bae: )
 
@thE_29: dankeschön 🙂

jop, das gibt einen feed reader (momentan ist nur RSS2.0 implementiert... ist aber erweiterbar)
bin mit dem aussehen von den auf windows verfügbaren readern irgendwie nirgens ganz happy...
da hab ich mir gedacht, schreib da doch selber was 🙂
 
@thE_29: hab mir aufgrund der RSS2.0 spezifikation selber was zusammengestellt... ist ja nicht so ein stress da den parser zu schreiben...

@AlArenal: gefällt mir einfach vom optischen her nicht 🙂
 
m@nu hat gesagt.:
@AlArenal: gefällt mir einfach vom optischen her nicht 🙂

Geschmackssache. Mir ist zunächst wichtiger dass das Teil ordentlich funktioniert und gut bedienbar ist. Wenn ich mir deinen Screenshot anschaue, würde ich bei meinen derzeit rund 70 Feeds doch ne Krise bekommen, wollte ich da den Überblick bewahren. Da hilft mir dann auch keine schicke Optik.
 
ne is klar... das mit der übersicht stimmt.
die idee zum programm ist aber eher aus eigennutzen entstanden. ich habe nicht sonderlich viele feeds, welche ich pro tag abarbeite... benutze momentan RSSOwl, welches mir für meinen nutzen doch ein wenig überdimensioniert scheint...

für die organisation habe ich den tagbutton eingebaut, über welchen ich später noch eine filterfunktion einbauen werde...

zudem muss ich zugeben, möcht' ich einfach wiedermal mit den möglichkeiten von swing herumexperimentieren :bae:
 
Hat das maximieren eigentlich irgendeinen Einfluss auf deine Animationsstufen/Bildgrößen, oder sieht es genau gleich aus, dauert aber länger?
 
das ist ja das komische... sieht genau gleich aus, und auch der clipping-bereich bleibt gleich (hab den mal per drawRect ausgeben lassen)
 
hmm, ich würde mal einen Profiler versuchen. Sowas ähnliches ist mir auch mal passiert, lag dann ein einem blöden 'super' Aufruf :bae:
 
dankeschön, werds mir mal anschauen...

hab mich mal an romain guy (http://www.jroller.com/page/gfx), meiner meinung nach der swing-gott schlechthin, gewendet.
hier seine antwort:

Romain Guy hat gesagt.:
Hi,

Avoid calling repaint() but rather repaint(x, y, w, h) when you don't need to repaint the
whole glass pane. That means you must indeed honor the clipping rectangle in your
painting code. The other problem is that repainting the glass pane entails repainting the
whole frame. To work around this, copy the content of the underlying frame in a picture
and use that picture as the background of your glass pane.

Although: DO NOT USE getScaledInstance(). Ever. Instead, call drawImage(image, x, y, w,
h, null). Do not forget to use a compatible image before painting it on screen, this will
speed up performance.

mit den grössenangaben im repaint-aufruf funktioniert das ganze göttlich :-D

danke für eure unterstützung leute.
grüsse aus der schweiz
m@nu
 
Hihi 😉

Naja, dafür gibts im repaint ja die x,y,w,h (oder rectangle) damit er nur das repainted!

Obacht ist dann in der paint Methode nicht mit Graphics.getClipBounds() zu arbeiten, da er dir sonst zuwenig zurückgibt 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben