Java-TexturePaint sehr langsam

Eichelhäer

Bekanntes Mitglied
Hallo,
ich hab ein JFrame mit nem JPanel und zeichne darin mittels repaint eine 32x32 Kacheln großes isometrisches Spielfeld.
Das ganze wird mit nem transformierten ( AffineTransform) Shape array und nem TexturePaint array im konstruktor erzeugt und anschließend mittels g2.setPaint und g2.fill auf den Bildschirm gerendert. Ich translatiere nun das spielfeld mittels g2.translate und scrolle so die map. Das problem ist, dass das ganze trotz des einmaligen ladens bzw erzeugens sowohl der shapes als auch der texture das ganze sehr stark ruckelt. Ich hab mich durch viele foren gelesen. Vorschläge mit backbuffer oder volatile image etc. brachten gingen auch nicht. Außerdem habe ich mit g2.clip den renderBereich eingeschränkt und in repaint nur den relevanten Bereich zum neuzeichnen angegeben. Ebenso die g2.clearRect Methode. Daher meine Frage ist dieses Texture Paint so "teuer" für die laufzeitumgebung, dass es einfach so ruckelt oder an was liegt das? Ich kann natürlich sehr große TileMaps anzeigen ohne Texture Paint mit der klassischen Methode und render bereich einschränken auch isometrisch. Mich hätte das nur interessiert wie man dieses Texture Paint verstehen soll. Java hat ja in der Standard library sooooo viele sehr nützliche Klassen, es gibt nur zu wenig beispiele für eher unbekannte Klassen.
 

Eichelhäer

Bekanntes Mitglied
Java:
public void init() {
        
        iso_tile_sprites  = new Sprite("isometric_demo",TILE_SIZE.x,TILE_SIZE.y);
        
        transform = new AffineTransform();
        transform.preConcatenate(AffineTransform.getRotateInstance(Math.toRadians(45.0)));
        transform.preConcatenate(AffineTransform.getScaleInstance(TILE_SIZE.x/2,TILE_SIZE.y/2));
        transform.preConcatenate(AffineTransform.getTranslateInstance(width/2,0));
        
        shape = new Shape[WORLD_SIZE.x*WORLD_SIZE.y];
        
        for(int y = 0; y < WORLD_SIZE.y; y++) {
            for(int x = 0; x < WORLD_SIZE.x; x++) {
                shape[y*WORLD_SIZE.x+x] = transform.createTransformedShape(new Rectangle2D.Double(x,y,1,1));
            }
        }
        
        tp = new TexturePaint[WORLD_SIZE.x*WORLD_SIZE.y];
        
        for(int y = 0; y < WORLD_SIZE.y; y++) {
            for(int x = 0; x < WORLD_SIZE.x; x++) {
                tp[y*WORLD_SIZE.x+x] = new TexturePaint(iso_tile_sprites.getSpriteImage(--mapdata[y*WORLD_SIZE.x+x]),shape[y*WORLD_SIZE.x+x].getBounds2D());
            }
        }
    }

@Override
    public void paint(Graphics g) {
        super.paint(g);
        
        Graphics2D g2 = (Graphics2D) g;
        
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        
        g2.setBackground(Color.black);
        g2.clearRect(0,0,width,height);
        
        g2.clipRect(0,0,width,height);
        
        g2.translate(offset.x,offset.y);
        
        for(int y = 0; y < WORLD_SIZE.y; y++) {
            for(int x = 0; x < WORLD_SIZE.x; x++) {
                g2.setPaint(tp[y*WORLD_SIZE.x+x]);
                g2.fill(shape[y*WORLD_SIZE.x+x]);
            }
        }
        
        g2.translate(-offset.x,-offset.y);
        
        g2.setClip(null);
        
        g2.dispose();
    }

Der Rest ist einfach der offset mittels Tasten die geupdated werden und ein JFrame mit JPanel als content pane und natürlich eine rudimentäre spielschleife.
 

Eichelhäer

Bekanntes Mitglied
Ich muss dazu sagen, dass ich hier die kachelkoordinaten im rec2d erzeugt habe. Die Laggs entstehen aber auch bei der erzeugung von screen koordinaten.
 

Eichelhäer

Bekanntes Mitglied
Und der renderbereich ist bei dieser mapgröße nicht eingeschränkt also mit startx endx etc., da die gesamte karte auf dem screen sichtbar ist.
 

LimDul

Top Contributor
Als ersten Schritt - gibt es einen Grund, das du paint und nicht paintComponent überschreibst? In der Regel sollte man in Swing Anwendungen paintComponent überschreiben. Sollte aber nicht wirklich was ausmachen.

Beim lesen der Doku bin ich aber auf folgendes gestoßen:
The size of the BufferedImage object should be small because the BufferedImage data is copied by the TexturePaint object.
Du erzeugst WORLD_SIZE * WORLD_SIZE TexturePaint Objekte.

Frage: Wie groß ist WORLD_SIZE? Wie groß sind die Sprites? Evtl. läufst du einfach in Speicherprobleme rein.
 

Eichelhäer

Bekanntes Mitglied
Die WORLD ist 32x32 Kacheln groß das hatte ich bereits geschrieben. Die BufferedImages also die Textur is 40x20 pixel groß. Ist nur ein sehr kleine Spritesheet mit 12 Isometrischen Texturen.
 

Eichelhäer

Bekanntes Mitglied
Zum active rendering: Ich hatte es auch mit ner Canvas und ner Bufferstrategy versucht mit 3 Buffern (siehe oracle active rendering tutorial),allerdings isses da dasgleiche. Ich denke das das mit diesem Graphics objekt und dieser texture Paint Klasse zusammenhängt, denn wie bereits erwähnt kann ich Welten mit derselben Textur der Größe 3200x3200 zeichnen und alles läuft flüssig. Hier nehme ich dann zum zeichnen der Textur eben die drawImage methoden was ohne probleme funktioniert. Ich möchte nur mal was anderes versuchen und mir eben diese Graphics2D Klasse mal genauer ansehen rein Interessehalber. Ich komme außerdem ganz gut klar mit dieser AffineTransform klasse und ein Isometrisches spielfeld ist ja nicht anderes als ein um 45 Grad gedrehtes und translatiertes grid aus einzelnen tiles, die man im verhältnis 2:1 skalieren kann, um einen schönen isometrichen effekt zu erhalten. Klar das ganze geht mit opengl und 3 dimensionalen vektoren eventuell besser und präziser, ist aber nicht unbedingt einfacher, wenn man mit opengl noch nicht so viel erfahrung hat. Texture Paint enthält auch die klasse createContext allerdings bin ich dabei ratlos.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
J Spiel mit Java AWT, Swing, JavaFX & SWT 9
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
N FXMLLoader.load java.lang.RuntimeException: Gradle AWT, Swing, JavaFX & SWT 2
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
V Java-Zeichenfeld mit AWT AWT, Swing, JavaFX & SWT 3
N java Gui friert scheinbar zufällig ein AWT, Swing, JavaFX & SWT 5
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
P Java Fx einrichten AWT, Swing, JavaFX & SWT 2
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
MiMa Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Trèfle Ausklappbare Diagramme in Java AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
K JAVA FX Constraints AWT, Swing, JavaFX & SWT 2
F Java FX und webcam AWT, Swing, JavaFX & SWT 1
T Wie kann man in java aufwendige grafiken programmieren AWT, Swing, JavaFX & SWT 1
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
J Java SWT Tabelleninhalt formattieren AWT, Swing, JavaFX & SWT 10
Blender3D Falsche Werte mit Java Toolkit Screensize AWT, Swing, JavaFX & SWT 4
K Swing AWT-EventQueue-1 java.lang.NoClassDefFoundError bei setVisible(true) AWT, Swing, JavaFX & SWT 3
A Java Programm gestalten AWT, Swing, JavaFX & SWT 4
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
I Java Bildfarbe ändern wie bei Photoshop AWT, Swing, JavaFX & SWT 9
R JavaFX Java FXML Vererbung in Klassen AWT, Swing, JavaFX & SWT 9
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
J Parallele Aktionen in Java FX richtig durchführen. AWT, Swing, JavaFX & SWT 5
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
M JavaFX java.lang.IllegalStateException: Location is not set. AWT, Swing, JavaFX & SWT 9
L Java- CardLayout AWT, Swing, JavaFX & SWT 10
M Java zeichnet nicht pixelgenau AWT, Swing, JavaFX & SWT 40
B Swing Eclipse is running under 0, but this Java project has a 1.6 Java compliance level, so WindowBuilder AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
S Java Gui AWT, Swing, JavaFX & SWT 5
R Sierpinski Dreieck mit Java FX AWT, Swing, JavaFX & SWT 4
Flynn java.lang.UnsupportedOperationException: Not supported yet AWT, Swing, JavaFX & SWT 7
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L java.lang.NullPointerException - Fehlermeldung AWT, Swing, JavaFX & SWT 2
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
L Java Fx Installationsprobleme AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben