Editor für ein kleines 2D Spiel total langsam

Also,

ich bin gerade ein kleines 2D Spiel am schreiben, das Mario sehr nahe ist aber halt noch nicht fertig ist.
Und es funktioniert letzte Zeit sehr gut. Und obwohl ich das Fenster 1000 mal in der Sekunde “repainte” und noch mal 1000 mal in der Sekunde prüfe, ob ich in einer Wand stecke, läuft es sehr flüssig.

Doch jetzt habe ich angefangen an einem Editor zu arbeiten, um nicht die Welt immer durch “new Wand()” zu erstellen und der nimmt auch schon seine Gestalt an, doch schon vom Anfang an habe ich damit zu kämpfen, dass das Ding so langsam ist, obwohl die paint() Methode fast dieselbe ist.
Einzig allein geändert hat sich, dass ich par ActionListener mehr habe und um das JPanel auf dem zeichne noch mehr JPanels sind, dafür aber zeichne ich nur 20 mal in der Sekunde und prüfe nicht ob ich in einer Wand stecke.

Jetzt weiß ich aber nicht woran das liegen könnte.
Kann man ActionListener, MouseListener und MouseWheelListener in eine Class schreiben?
Oder kann es daran liegen das ich Bilder, die in JPanels am rand sind, separat mit der paintComponent() Methode des jeweiligen Panels zeichne und nicht mit der paint() methode von dem JFrame?

Danke im voraus.

Doch jetzt habe ich angefangen an einem Editor zu arbeiten, um nicht die Welt immer durch „new Wand()“ zu erstellen und der nimmt auch schon seine Gestalt an, doch schon vom Anfang an habe ich damit zu kämpfen, dass das Ding so langsam ist, obwohl die paint() Methode fast dieselbe ist.

Bei Swing-Komponenten sollte man paintComponent überschreiben und nicht paint, viel mehr kann ich mit dem Satz leider nicht anfangen :reflect:

Kann man ActionListener, MouseListener und MouseWheelListener in eine Class schreiben?

Kann man machen, muss man aber nicht.

Oder kann es daran liegen das ich Bilder, die in JPanels am rand sind, separat mit der paintComponent() Methode des jeweiligen Panels zeichne und nicht mit der paint() methode von dem JFrame?

Wo kommen denn die Bilder her? Falls du sie bei jedem Zeichnen neu lädst erklärts das die schlechte Performance. Zur paint-Methode: siehe oben.

Etwas Beispielcode wäre hilfreich.

Gruß

Bei Swing-Komponenten sollte man paintComponent überschreiben und nicht paint

Habe ich, am Anfang habe ich es nur falsch erwähnt. Aber unten habe ich auch gesagt das ich paintComponent() nutze und wollte fragen ob ich nicht lieber paint() überschreiben soll.

Falls du sie bei jedem Zeichnen neu lädst erklärts das die schlechte Performance.

Ich Lade die Bilder schon nur ein mal, doch ich wurde schon über eine Private Nachricht darauf hingewiesen, dass es wahrscheinlich daran liegen wird, dass ich die Bilder bevor ich sie zeichne mit .getScaledInstance() vergrößere/verkleinere um somit zoomen zu können und das teilweise fiel Rechenleistung zieht, obwohl ich das auch nicht glaube, weil auch wenn ich nur jede Sekunde paintComponent() aufrufe. Hängt das Programm fürchterlich.

Den Quellcode zu posten wird auch nicht gehen, weil die eine Class-Datei schon 800 Zeilen hat.
Aber ich habe mal die paintComponent() Methode vereinfacht:

		Graphics2D g2d =(Graphics2D)g;
		
		g2d.setPaint(new TexturePaint(Fenster.bg,new Rectangle(Fenster.bgx/5, Fenster.f.getHeight()-864-100, 1024, 864)));
g2d.fillRect(0, 0, Fenster.f.getWidth(), Fenster.f.getHeight());
		
		for(int i=0;i<Wand.i;i++){
			Wand w = Wand.a**;
			
			//verkleinert/vergrößert das bild
			BufferedImage bo;
			bo=new BufferedImage((int)(32*Fenster.zoom),(int)(32*Fenster.zoom), BufferedImage.TYPE_INT_ARGB);
			bo.getGraphics().drawImage(Fenster.bo2.getScaledInstance((int)(32*Fenster.zoom),(int)(32*Fenster.zoom), Image.SCALE_SMOOTH), 0, 0 , null);
			
			//Zeichnet die Wand
			g2d.setPaint(new TexturePaint(bo,new Rectangle((int)((Fenster.bgx+w.x)*Fenster.zoom), (int)((Fenster.bgy+w.y)*Fenster.zoom), (int)(32*Fenster.zoom), (int)(32*Fenster.zoom))));
			g2d.fillRect((int)((Fenster.bgx+w.x)*Fenster.zoom), (int)((Fenster.bgy+w.y)*Fenster.zoom), (int)(w.b*Fenster.zoom), (int)(w.h*Fenster.zoom));
			
		}
		
		//Wenn man eine Wand "zeichnen" möchte zeigt ein schwarzer Ramen wo die wand sein wird
		g2d.setColor(Color.BLACK);
		if(Fenster.zeichnen){
			try{
				g2d.drawRect(Fenster.zx, Fenster.zy, (int)Fenster.f.getMousePosition().getX()-Fenster.zx-10, (int)Fenster.f.getMousePosition().getY()-Fenster.zy-30);
			}catch(NullPointerException ex){
				Fenster.zeichnen=false;
			}
		}
			
		
		
	}```

Du erstellst pro Zeichenvorgang extrem viele Objekte.
Das Skalieren und Zeichnen der Wände könntest du z.B. über die drawImage-Methode von Graphics erledigen die x,y und width,height als parameter bekommt.
Das geht wesentlich schneller als pro Wand ein BufferedImage, davon eine skalierte Instanz und einen TexturePaint zu erstellen.

Gleiches für die ersten zwei Zeilen.
Auf den ersten Blick sehen die so aus als würde folgender Aufruf das gleiche machen (Falls du Bereiche auslassen willst oder anders skalierst müsstest du das natürlich anpassen):
g2d.drawImage(Fenster.bg,0,0,Fenster.width,Fenster.height,null);

Der Block hier sieht auch böse aus:

                Fenster.zeichnen=false;
            }```

Gruß

Ja, da werden neue Bilder erstellt, in die ein Bild skaliert reingemalt wird, das mit getScaledInstance erstellt wurde… das ist in mehrerer Hinsicht schlecht. Allgemein hatte ich kürzlich mal ein bißchen was in http://wiki.byte-welt.net/wiki/Bilder_skalieren geschrieben, ist natürlich noch ausbaufähig, aber könnte schonmal einen Blick wert sein (den wichtigsten Punkt, zum skalierten Zeichnen, hat Firephoenix schon angedeutet)

Ich habe das jetzt so umgeschrieben, dass Wände mit drawImage() gezeichnet werden,
und die Tetxur die ich davor durch ein TexturePaint erreicht hatte erhalte ich jetzt durch einer for-Schleifen.
Und jetzt läuft das Programm schon fiel flüssiger.
Danke.