Frage

Ich rufe ein paar Mal von einem Zuhörer neu aufgebaut, aber die Art, wie ich meine Farbe Funktion entworfen ist nur ein Repaint erforderlich ist. Ich erzeugen ein Bündel von Bemalungen, da sie in meine Maus Bewegung Hörer angeschlossen.

Gibt es eine Möglichkeit alle anstehenden repaints für eine bestimmte Komponente zu stornieren? Ich kann einfach nicht starten repaints ignorieren, da einige sind gültig, wie wenn man den Rahmen oder die Größe wiederherstellen aus minimieren.

Warum ich das an? Weil meine Farbe Code sehr schwer ist und ich kann voll Bemalungen auf einem sehr hohen FPS nicht tun.

War es hilfreich?

Lösung

Schaukel wird repaints für Sie kombinieren: siehe "Malerei in AWT und Swing " auf der Website von Sun. Wenn Sie eine Reihe von Bemalungen in schnellen Folge planen, werden sie in einen einzigen Aufruf paintImmediately bekommen kombiniert ().

Andere Tipps

Frequent Repaint-Anfragen werden in einer automatisch zusammenbrach. Der beste Weg, dies zu optimieren, ist die ganze Sache nicht, neu zu zeichnen, aber mit den Koordinaten von bestimmtem Bereich neu aufgebaut nennen. Dies bedeutet, dass Sie nur den Bereich neu aufgebaut, die tatsächlich geändert wird.

Mein Verständnis ist, dass repaint() einfach Pläne ein Neuzeichnen durch einen Bereich der Komponente zur repaint Warteschlange hinzufügen. Wenn ein Repaint bereits auf einer Komponente angefordert worden ist, wird die neue repaint Region nur mit den zuvor angeforderten Regionen unioned sein. Die Repaint nicht wirklich, bis alle anderen Ereignisse in der Ereigniswarteschlange ausgeführt behandelt werden. Also, Ihre zusätzlichen Bemalungen nicht viel Unterschied machen, das heißt Ihr Malerei-Code wird nur einmal ausgeführt werden. Siehe JComponent.repaint und RepaintManager.addDirtyregion .

Ich habe gehackt etwas ähnliches zusammen zu verbessern, wie JFreeChart zu malen entscheidet, wann es viele Anrufe macht neu zu streichen.

Im Wesentlichen ich wie folgt vor:

  • Erstellen Sie eine ScheduledExecutorService als ein Feld in der Klasse
  • Empfangen erste repaint Anfrage und und submit sie den Vollstrecker auf der EDT in etwa 50 ms ausführen, um die Zukunft immer wieder
  • Empfang zweite Anfrage - Test, um zu sehen, ob die vorherige repaint beendet hat (fut.isDone()) und wenn ja, die nächste Repaint zu planen; sonst nichts tun.

Auf diese Weise können höchstens 20 Repaint Anfrage pro Sekunde bekommen sollte.

Ich habe zur Dosierung bis die Anzahl der Anrufe ähnliche Dinge getan fireDataTableChanged, wenn viele Änderungen an der gleichen Zeit auftreten.

Ich höre, was Sie sagen. Sie können in der Tat nur einen Teil der Fläche neu streichen. In den „Performing Benutzerdefinierte Gemälden Beispiele“ auf der Sun-Website fand ich ein gutes Beispiel, das zeigt, wie ein gezogenes Rechteck zu zeichnen, und dann nur diesen Bereich neu aufgebaut, wenn die Maus bewegt oder freigegeben wird.

Hier ist der relevante Abschnitt des Codes ...

public void mouseDragged(MouseEvent e) {
            updateSize(e);
        }

        public void mouseReleased(MouseEvent e) {
            updateSize(e);
        }

        /* 
         * Update the size of the current rectangle
         * and call repaint.  Because currentRect
         * always has the same origin, translate it
         * if the width or height is negative.
         * 
         * For efficiency (though
         * that isn't an issue for this program),
         * specify the painting region using arguments
         * to the repaint() call.
         * 
         */
        void updateSize(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            currentRect.setSize(x - currentRect.x,
                                y - currentRect.y);
            updateDrawableRect(getWidth(), getHeight());
            Rectangle totalRepaint = rectToDraw.union(previousRectDrawn);
            repaint(totalRepaint.x, totalRepaint.y,
                    totalRepaint.width, totalRepaint.height);
        }

Dieser Code ist urheberrechtlich geschützt (siehe hier für vollständigen Code und Copyright-Hinweis )

Siehe hier für weiteres Beispiel Inserate

Die Wahrheit zu sagen, ich bin auf FPS ein ähnliches Problem haben, aber das kann aufgrund meiner momentan schlechten Code sein! Ich habe so viel in den letzten Monaten gelernt, dass ich jetzt meinen Code so effizienter machen kann. Hoffentlich kann ich das FPS Problem überwinden, wenn mehr als 2 „Menschen“ meine Grafiken slow down! Hummmm ... Ich habe implementiert nur den obigen Code für den gleichen Abschnitt in meinem Code, und andere nicht, aber mit allen Mitteln, es zu versuchen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top