Java, wie man ständig wechselnde Grafiken zeichnet

8

Habe das noch nicht gemacht, also sauge ich offensichtlich daran. Hier werden 64 Pixel um die aktuelle Mausposition auf einem Formular etwas größer gezeichnet. Das Problem ist, dass es "irgendwie" langsam ist, und ich habe keine Ahnung, wo ich anfangen soll zu reparieren.

Außerdem habe ich einen Thread erstellt, der ständig aktualisierte Grafiken aufruft, wenn er fertig ist und ein paar fps wie Text, um wirklich zu zeigen, wie schnell die Dinge gezeichnet werden.

Bildbeispiel: (Bild stammt vom Buchstaben 'a' in Eclipse)

Codebeispiel:

%Vor%

Änderungen vorgenommen:
* hinzugefügt "gc.dispose ();"
* hinzugefügt "Isdone", so konnte Redraw nicht schneller aufgerufen werden, dann sollte es * hinzugefügt diesen Link zu thrashgod source rewrite
* hinzugefügt diesen Link zu thrashgod source rewrite 2

    
Margus 18.09.2010, 17:35
quelle

4 Antworten

13

Hier ist meine Hauptumschreibung mit den folgenden bemerkenswerten Änderungen:

  • Ich habe die Aufgabe der Erkennung von Pixelfarben von der Aufgabe des Zeichnens
  • getrennt
  • Ich habe robot.getPixelColor (...) durch robot.createScreenCapture (...) ersetzt, um alle 64 Pixel gleichzeitig zu holen, anstatt nacheinander
  • Ich habe Smart Clipping eingeführt - nur was neu gezeichnet werden muss, wird neu gezeichnet.
  • Ich habe das Threading behoben, damit alle Updates für das Modell und die Ansicht auf dem Ereignis-Dispatch-Thread
  • stattfinden

Der Ticker läuft ständig. Wenn es eine Änderung der Pixelfarbe erkennt (entweder aufgrund der Bewegung der Maus in eine andere Region oder der sich unter der Maus ändernden Pixel), erkennt es genau, was geändert wurde, aktualisiert das Modell und fordert dann die Anzeige auf, neu zu zeichnen. Dieser Ansatz wird sofort für das menschliche Auge aktualisiert. 289 Bildschirmaktualisierungen dauerten kumulativ 1 Sekunde.

Es war eine angenehme Herausforderung für einen ruhigen Samstagabend.

%Vor%     
Steve McLeod 18.09.2010, 23:08
quelle
6

Wenn es Ihnen nichts ausmacht, Swing zu verwenden, zeigt dieses Beispiel , wie Sie schnell ein BufferedImage , das von einem erhalten wurde, heranzoomen können %Code%. In deinem Fall möchtest du ein 8x8 Icon , das in BufferedImage mit den Pixeln gefüllt wird, die der Roboter sieht.

Nachtrag: Hier sehen Sie eine Momentaufnahme der linken oberen Ecke Ihres Beispiels.

Nachtrag:

  

Das Zoomen selbst ist nicht wichtig ...

Der langsame Teil bezieht Pixel vom Desktop; Skalierung ist geringfügig. Wenn Sie nur eine Vielzahl von Animationstechniken sehen möchten, werfen Sie einen Blick auf dieses Beispiel .

Nachtrag: Da das Holen einzelner Pixel langsam ist und die von @ Steve McLeod vorgeschlagene mouseMoved() Methode schnell ist, hier ist die Idee, die ich gefahren bin. Sie können sehen, dass es auch viel reibungsloser aktualisiert. Beachten Sie, dass durch das Loslassen der Maustaste die erfassten Farben angezeigt werden.

%Vor%     
trashgod 18.09.2010 18:03
quelle
0

Fügen Sie diese Methode zur Paint-Methode hinzu:

%Vor%

Okay, verwenden Sie den Timer, um die Verzögerung zu verlangsamen, nicht ein Threading, das ist schlecht.

    
Blue Okiris 19.11.2013 23:19
quelle
-1

Verwenden Sie einfach eine Zeitverzögerungsschleife. Sie können die Verzögerung dann feineinstellen, indem Sie die Grenzen von i einstellen. Sie können auch die Übergangsgeschwindigkeit durch einige Treffer und Versuche einstellen.

für (lange i = 0; i & lt; = 100000000000; i ++);

canvas.repaint ();

Es funktioniert sehr gut mit mir und auch keine Notwendigkeit, gepufferte Bilder zu verwenden.

    
Ritik 03.04.2016 07:41
quelle

Tags und Links