besser neu zeichnen und fps frage

Status
Nicht offen für weitere Antworten.

Templon

Bekanntes Mitglied
Hi,
Also ich habe zwei Fragen.

1. Ich habe ein 2-Dimensionales Array von Tiles, welches recht gross ist (200 * 200), wenn das ganze voll ist dauerts sehr lange um das alles neu zu zeichnen, was bei einem Spiel ja nicht der Fall sein sollte. Kann ich das irgendwie geschickt optimieren so dass er nicht immer alles neu zeichnet? (Macht er ja eigentlich auch nicht, man sieht ja nicht das ganze Array auf dem Bildschirm, aber es dauert trotzdem sehr lange...

2. Ich habe in dem Game ein main Loop welcher am schluss die repaint() funktion aufruft. aber um die FPS heraus zu finden, muss ich ja die zeit haben vom neu zeichnen. Aber wenn ich jetzt zueberst von der schleife die Zeit nehm und unten am repaint, hat er immer gleich lang (32ms) egal wie viele Tiles man sieht, oder wie fest es stock. Warum?

Danke schon im voraus.

Templon
 

Chris_1980

Bekanntes Mitglied
Zu 2:
Die FPS mußt du in deiner Paint-Methode messen, halt wie oft die vom EventDingenskirchenThread aufgerufen wird. Mit repaint() zeichnest du ja nicht, sondern gibst nur ein Signal das dann mal demnächst neugezeichnet werden sollte.

Zu 1:
Da gibt es möglicherweise schon n paar Sachen die man noch optimieren kann, aber dafür müßtest du wohl mal was Code posten...
 

Marco13

Top Contributor
Er ZEICHNET sowieso nur das, was man auf dem Bildschirm sieht. (Hm. Zwangsläufig. Ja.) Vielleicht machst du etwas anderes aufwändiges, "während" du die Tiles zeichnest? Wenn du z.B. sowas hast wie
Code:
for (int i=0; i<200; i++)
{
    for (int j=0; j<200; j++)
    {
        Tile tile = tiles[i][j];
        machWasKompliziertes(tile);
        male(tile);
    }
}
könnte eben das "komplizierte" so lange dauern. Vermutlich wäre es aber in jedem Fall sinnvoll (falls möglich) abzufragen, ob überhaupt was mit dem Tile gemacht werden muss...
Code:
for (int i=0; i<200; i++)
{
    for (int j=0; j<200; j++)
    {
        Tile tile = tiles[i][j];
        if (esWirdAufDemBildschirmErscheinen(tile))
        {
            machWasKompliziertes(tile);
            male(tile);
        }
    }
}
 

Templon

Bekanntes Mitglied
Danke erstmal, ja das mit den FPS hab ich nu hinbekommen. Aber beim zeichnen hab ich noch probs, wenn ich denn bildschirm voller tiles habe und sonst nirgends läufts mit ca. 80fps, mit einer auflösung von 1024 * 768, aber wenn alles voll ist läufts etwa mit 2 fps oder so... morgen werde ich mal code dazu schreiben, hab echt keine Ahnung was da falsch sein könnte.

Edit:
Also das vorhin waren Daten von meinem Laptop (FPS), jetzt habe ich das ganze mal mit meinem PC getestet welcher um einges mehr an leistung hat. Mit vollem Bildschirm, 150 - 160 FPS. Mit vollem Array (200 * 200) ca 20 FPS.

So hier mal meine neu zeichenen funktion:

Code:
	public void paintItems(Graphics2D graphics) {
		for (int x = 0; x < EditorData.CELL_NUMBERS; ++x) {
			for (int y = 0; y < EditorData.CELL_NUMBERS; ++y) {
				if (gameMainFrameData.getGameField() != null & gameMainFrameData.getGameField().getField()[x][y].getBlock() != null) {
					gameMainFrameData.getGameField().getField()[x][y].getBlock().getImage().paintIcon(this,graphics,gameMainFrameData.getGameField().getField()[x][y]
					                                                                                .getBlock().getX() * 32, gameMainFrameData.getGameField().getField()[x][y].getBlock().getY() * 32);                                                     
				}
				if (gameMainFrameData.getGameField() != null & gameMainFrameData.getGameField().getField()[x][y].getPlayer() != null) {
					gameMainFrameData.getGameField().getField()[x][y].getPlayer().getImage().paintIcon(this, graphics, gameMainFrameData.getGameField().getField()[x][y]
					                                                                                .getPlayer().getX(), gameMainFrameData.getGameField().getField()[x][y].getPlayer().getY());
				}
			}
		}
	}
	/**
	 * 
	 *
	 */
	public void drawFps(Graphics2D graphics) {
		graphics.setColor(Color.BLACK);
		graphics.drawString("FPS: " + (Math.round(fps * 10)) / 10d, 10, 17);
	}

Edit2: Ja ich weis das diese ifs noch etwas zu lang sind, muss ich ma ein bisschen zusammenfassen mit den Namen :p

Und hier die hauptschleife:

Code:
	public void run() {
		try {
			while(true) {
//				double startTime = System.currentTimeMillis();
				Thread.sleep(20);
				if (gameMainFrameData.isMoveRight()) {
					for (int x = 0; x < EditorData.CELL_NUMBERS; ++x) {
						for (int y = 0; y < EditorData.CELL_NUMBERS; ++y) {
							if (gameMainFrameData.getGameField().getField()[x][y].getPlayer() != null) {
								gameMainFrameData.getGameField().getField()[x][y].getPlayer().movePlayer(Bearing.RIGHT);
								
							}
						}
					}
				} else  if (gameMainFrameData.isMoveLeft()) {
					for (int x = 0; x < EditorData.CELL_NUMBERS; ++x) {
						for (int y = 0; y < EditorData.CELL_NUMBERS; ++y) {
							if (gameMainFrameData.getGameField().getField()[x][y].getPlayer() != null) {
								gameMainFrameData.getGameField().getField()[x][y].getPlayer().movePlayer(Bearing.LEFT);
							}
						}
					}
				}
				repaint();
//				double endTime = System.currentTimeMillis();
//				System.out.println(endTime - startTime);
				
			}
		} catch (Exception e) {
			System.out.println("exeption in main loop");
			System.out.println(e.getMessage());
		}
	}

Templon
 

André Uhres

Top Contributor
Da werden Methoden aufgerufen, von denen man nicht ahnen kann was sie machen, und ohne Kristallkugel komm ich nicht dahinter.
 

Templon

Bekanntes Mitglied
Also bei der neu zeichnen funktion ist das hier nur um das Tile aus dem Array zu holen.

Code:
gameMainFrameData.getGameField().getField()[x][y].getBlock()

Der rest sollte eigentlich klar sein denke ich jetzt mal...
 

Chris_1980

Bekanntes Mitglied
Was mir daran auffällt ist, das du immer das ganze Array durchgehst.
Wenn es nicht voll ist wird
Code:
gameMainFrameData.getGameField().getField()[x][y].getBlock()
.getImage().paintIcon(this,graphics,gameMainFrameData.getGameField().getField()[x][y] 
.getBlock().getX() * 32, gameMainFrameData.getGameField().getField()[x][y].getBlock().getY() * 32);
und
Code:
gameMainFrameData.getGameField().getField()[x][y].getPlayer().getImage().paintIcon(this, graphics, gameMainFrameData.getGameField().getField()[x][y].getPlayer().getX(),
gameMainFrameData.getGameField().getField()[x][y].getPlayer().getY());
eben seltener ausgeführt.

Wie ist das denn aufgebaut?
Das Spielfeld ist eine 200*200 Felder große Karte, und man sieht immer nur einen ausschnitt von meinetwegen 50*50 Teilen?
Oder ist das Array keine Karte, sondern eine Quelle von Puzzleteilen die nach Schema X auf dem Bildschirm verteilt werden?
 

Chris_1980

Bekanntes Mitglied
Warum gehst du dann in den Schleifen nicht einfach nur die benötigten Reihen und spalten durch?

Code:
for(int row=3 ; row < 18 ; row++)
{
    for(int column = 15 ; column < 30 ; column++)
    {
     
    }
}
 

Templon

Bekanntes Mitglied
ja stimmt wäre eine idee, aber beim laufen wären dann die übergänge nicht gerade flüssig, oder?
 

Chris_1980

Bekanntes Mitglied
Wieso? Du mußt doch eh alle x sec neu zeichnen. Ob du nun Irgendwo im Nirvana zeichnest oder nicht. Da ist es doch wesentlich schneller wenn du nur das abarbeitest was umbedingt abgearbeitet werden muß.
 

Templon

Bekanntes Mitglied
hmm ja stimmt, hab noch ne frage, wie kann ich das dann geschickt machen das die "kamera" sozusagen dem spieler folgt?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Jtable besser darstellen AWT, Swing, JavaFX & SWT 6
L Eclipse Fehler besser zu verstehen!!! AWT, Swing, JavaFX & SWT 4
D Wie kann ich Buttons und Labels besser anordnen AWT, Swing, JavaFX & SWT 4
J Gibt es brauchbare GUI-Builder, oder doch besser alles per Hand machen? AWT, Swing, JavaFX & SWT 6
M jframe besser ordnen? AWT, Swing, JavaFX & SWT 10
I Applet mit Panels (so richtig, gehts besser?) AWT, Swing, JavaFX & SWT 3
F Text besser lesbar über Hintergrundbild AWT, Swing, JavaFX & SWT 6
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben