Graphics.drawImage() sehr schnell

Kento

Neues Mitglied
Hallo Community,

ich arbeite mit Java 6 unter Windows 7 und habe ein paar Fragen bezüglich der drawImage() Methode von der java.awt.Graphics Klasse. Denn mit
dieser Methode kann man ein Bild oder einen Bildausschnitt zeichnen.

Ich machte mir zuerst sorgen wegen der Performance, denn mit anderen Technologien wie .NET habe ich
festgestellt, dass wenn viel gezeichnet wird die Anwendung in die Knie geht. Doch nun musste ich überraschend feststellen, das dem scheinbar nicht so ist.

Ich habe mir dazu ein Beispielprogramm gebaut, dieses besteht aus einem JFrame, in welchem eine
JScrollPane eingesetzt wurde. In der JScrollPane steckt eine eigene, von JComponent abgeleitete
Komponente, welche eine Tilemap zeichnet. Wobei jedes Tile eine Größe von 32x32 Pixel besitzt. Diese eigene Komponente habe ich MapPanel genannt.

Die Größe dieser Komponente wurde auf 3200x3200 Pixel gesetzt, damit diese eine 100x100 Tilemap darstellen kann. Es wird aber natürlich immer nur der sichtbare Bereich der Tilemap gezeichnet.

Der Zeichenvorgang, darum geht es mir nämlich, wird in einer 3-Fach geschachtelten For-Schleife durchgeführt:

Java:
for(int x = 0; x < w; x++)
{
    for(int y = 0; y < h; y++)
    {
        for(int z = 0; z < 5; z++)
        {
            t = this.mapData[tx + x][ty + y][z];
            
            // Wenn 0 wird Gras gezeichnet, ansonsten eine gelbe Pflanze
            if(t == 0)
            {
                g.drawImage(this.tileset, scrX + x * 32,
                        scrY + y * 32,
                        scrX + x * 32 + 32,
                        scrY + y * 32 + 32, 0, 0, 32, 32, null);
            }
            else
            {
                g.drawImage(this.tileset, scrX + x * 32,
                scrY + y * 32,
                scrX + x * 32 + 32,
                scrY + y * 32 + 32, 32, 0, 64, 32, null);
            }
        }
    }
}

Die Variablen w und h in den Schleifen-Köpfen der beiden äußeren Schleifen speichern die Größe des sichtbaren Bereichs(in Tiles).

Die If-Abfrage innerhalb der Schleife dient dazu, je nach Lage der Map-Daten entweder Gras oder eine gelbe Pflanze zu zeichnen. Die Variablen tx und ty werden zu x und y addiert, da sie den Scroll-Wert(in Tiles) der Scroll-Balken beinhalten. Die Variablen scrX und scrY sind ähnlich wie tx und ty, nur speichern sie den Scroll-Wert in Pixeln und wurden zusätzlich modifiziert, so das ein weiches Scrolling entsteht.

Aber worum es eigentlich geht, die Schleife zeichnet eine Tilemap mit 5 Ebenen. Absolut problemlos,
mit Scrolling und allem drum und dran. Auch Tiles lassen sich per Mausklick verändern, ich habe schon einiges probiert und es geht problemlos. Und ich verstehe nicht warum es absolut KEIN bisschen ruckelt beim scrollen.

Selbst wenn ich 25 Ebenen zeichne ruckelt es nicht. Selbst dann, wenn ich die höchste Auflösung die mein Rechner hergibt einstelle(1280x1024) und das Fenster maximiere. Erst ab 50 Ebenen fängt es dann an zu stocken.
Das erscheint mir irgendwie zu krass, könnt ihr mir das erklären? Ich meine ist ja toll dass das sogut
läuft, aber ich kann das einfach nicht glauben. Das muss doch eine Täuschung sein.

gruß

Kento
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Na DAS ist doch mal eine Problembeschreibung, die ich auf der Arbeit gerne hören würde :D

Warum genau es wie schnell im Vergleich zu welcher anderen Methode ist, ist schwer zu sagen. Aber - sowas wie drawImage malt natürlich nur, wenn der Bereich in den gezeichnet wird auch sichtbar ist. Außerdem verwendet Java (je nach Version und Startparametern) OpenGL oder DirectX als Beschleunigung, und wenn man nicht durch irgendwelche zuuu strengen Vorgaben etwas tut, was dem im Wege steht, werden Bilder in ihrer "optimalen" Form erstellt - also so, dass sie schnell und hardwarebeschleunigt gezeichnet werden können. (Ein nicht ganz unüblicher (aber doch noch zu selten auftretender) Effekt: Wenn etwas als problematisch dargestellt oder kritisiert wird, wird SO massiv etwas dagegen unternommen, dass ... dann solche Beiträge wie deiner rauskommen - und wir wissen ja alle: "Java is voll lahm" - "Joa, und Swing erst, das is nichma nativ!" ;) )

Bei diesem speziellen Fall (dem Scrollen) könnte(!) aber ein Punkt der entscheidende sein: Eine JScrollPane hat intern einen JViewport, und der verwendet clevere Tricks, um das Scrollen schnell zu machen - da kann man sich mal Methoden wie JViewport (Java 2 Platform SE 5.0) ansehen. Vielleicht schaffst du es ja, mit einem anderen ScrollMode das ganze langsamer zu machen :(
( :joke: )
 
S

SlaterB

Gast
und beim Scrollen sollte doch die paint-Methode auch nur einmal durchlaufen werden und ein größeres Stück malen dass dann verschoben wird, oder?
wäre leicht durch Log-Ausgaben zu testen,
(edit: ok, das steht bei BACKINGSTORE_SCROLL_MODE ja auch)

ein fertiges Bild zu verschieben ist nicht so schwer, bei evtl. noch einem Mausklick pro Sekunde neuzuzeichnen wäre dann auch nicht die Kunst
 

André Uhres

Top Contributor
Und ich verstehe nicht warum es absolut KEIN bisschen ruckelt beim scrollen. [...] Das erscheint mir irgendwie zu krass, könnt ihr mir das erklären?
Die ruck- und flackerfreien Malvorgänge des Swing RepaintManagers werden einerseits durch die in Swing eingebaute Doppelpufferung ermöglicht und andererseits durch diverse JComponent Eigenschaften optimiert. Z.B. gibt die JComponent Methode "isValidateRoot()" für die meisten Komponenten "false" zurück. JScrollPane ist, neben JRootPane und JTextField, eine der wenigen Komponenten die true als default Wert zurück geben. Das bedeutet, dass der Inhalt eines JScrollPane in jeder Situation erfolgreich ausgelegt werden kann, ohne irgendwelche Vorfahren oder Geschwister zu berühren. Das ist wohl in diesem Fall ein wesentlicher Faktor für die Leistungsfähigkeit der Darstellung.
 

Marco13

Top Contributor
@André Uhres: Bist du sicher, dass das hier gemeint ist (und Einfluß darauf hat)? ???:L Wenn man eine ScrollPane mit einer riesen Component darin hat, dann dürfte da Double Buffering keinen Geschwindkeitsvorteil bringen - und layouten muss er beim Scrollen ohnehin nicht :bahnhof: Ich tippe eher darauf, dass da die ScrollPane mit ihrem Viewport das aufwändige Neuzeichnen "versteckt". Bemerken würde man das vermutlich spätestens, wenn man den ScollMode umschalten oder in dieser Component etwas animiertes zeichnen würde...
 

André Uhres

Top Contributor
@André Uhres: Bist du sicher, dass das hier gemeint ist (und Einfluß darauf hat)?
Ich wollte eigentlich auch nur darauf hinweisen, dass Swing über eine ganze Reihe von ausgefeilten und intelligenten Mechanismen verfügt, die alle dasselbe Ziel verfolgen, nämlich die Leistungfähigkeit der Darstellung zu maximieren. Was hier letztlich auschlaggebend ist, kann ich auch nur vermuten. Man kann ja nicht alles wissen :D .
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Graphics.drawImage von unten nach oben abbilden lassen AWT, Swing, JavaFX & SWT 6
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
M Graphics.drawImage verlangsamt sich plötzlich AWT, Swing, JavaFX & SWT 15
G Graphics.drawImage() AWT, Swing, JavaFX & SWT 6
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R AWT Graphics initialisieren AWT, Swing, JavaFX & SWT 15
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
B Graphics to Image AWT, Swing, JavaFX & SWT 3
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
M Graphics.fillOval AWT, Swing, JavaFX & SWT 1
javampir Sauberes Faden mit awt Graphics AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
vodkaz Graphics aufrufen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
M JFrame Graphics.drawString Problem AWT, Swing, JavaFX & SWT 11
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
R Ankerpunkt bei Graphics AWT, Swing, JavaFX & SWT 3
R Fließende Bewegung von Graphics AWT, Swing, JavaFX & SWT 6
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
P "Graphics" wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
T Graphics zeichnet nicht AWT, Swing, JavaFX & SWT 2
T Applet graphics - zeichnen funktioniert nicht AWT, Swing, JavaFX & SWT 14
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
S Zeichnen mit java.awt.Graphics AWT, Swing, JavaFX & SWT 6
D Graphics zeichnen AWT, Swing, JavaFX & SWT 6
M Graphics auf JFrame Koordinatensystem AWT, Swing, JavaFX & SWT 3
T Graphics Ersetzend Zeichnen AWT, Swing, JavaFX & SWT 6
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
D Erzeugen eines leeren Graphics-Objektes AWT, Swing, JavaFX & SWT 7
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
A AWT AWT Panelfenster mit Graphics kombinieren AWT, Swing, JavaFX & SWT 7
T Graphics Parameterübergabe AWT, Swing, JavaFX & SWT 3
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
S Swing AWT (graphics (g)) AWT, Swing, JavaFX & SWT 27
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
B Swing Tooltips auf Graphics AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
E Problem bzw. Sinn von Graphics / Graphics Context AWT, Swing, JavaFX & SWT 21
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
F Methode drawOval(int,int,int,int) von graphics AWT, Swing, JavaFX & SWT 4
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
S Mit Graphics g ins Fenster zeichnen AWT, Swing, JavaFX & SWT 4
G Graphics - Raute AWT, Swing, JavaFX & SWT 3
G "pinseldicke" bei Graphics? AWT, Swing, JavaFX & SWT 2
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
W java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Dev AWT, Swing, JavaFX & SWT 1
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
L Graphics AWT, Swing, JavaFX & SWT 37
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
Y Problem mit der Referenz eines Graphics-Objekts AWT, Swing, JavaFX & SWT 5
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
K Gutes Buch gesucht (Graphics Only) Kennt jemand eins? AWT, Swing, JavaFX & SWT 5
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
E Image, Graphics, verzögert zeichnen AWT, Swing, JavaFX & SWT 2
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
H neuzeichnen von graphics nach minimierung oder ähnlichem AWT, Swing, JavaFX & SWT 10
G SWT Graphics Zeichnung neu laden AWT, Swing, JavaFX & SWT 13
G SWT Graphics GC Problem AWT, Swing, JavaFX & SWT 6
M Abstrakte Graphics Klasse erzeugen AWT, Swing, JavaFX & SWT 2
H awt Graphics und Image selbermachen ? AWT, Swing, JavaFX & SWT 12
D Image aus Graphics erstellen? AWT, Swing, JavaFX & SWT 2
R Graphics Objekt ändern AWT, Swing, JavaFX & SWT 11
raptorrs J2D graphics, sind 500px immer 500 px AWT, Swing, JavaFX & SWT 2
G Graphics AWT, Swing, JavaFX & SWT 2
H Graphics: Schriftgröße ändern AWT, Swing, JavaFX & SWT 4
X Problem mit Image und Graphics AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben