Forum: PC-Programmierung Java - repaint() Verlangsamen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lukas B. (mind)


Lesenswert?

Guten Abend,

ich hatte bei meinem in Java programmierten Spiel immer das Problem, 
dass mein Lüfter von meinem MacBook immer lauter wurde. Dann habe ich 
meine CPU genauer beobachtet und festgestellt, dass diese beim Start 
extrem in die Höhe steigt.

Nachdem ich bisschen geschaut habe, habe ich die repaint() Methode in 
paintComponent auskommentiert und schon hatte ich das Problem nicht 
mehr.

Jetzt ist meine Frage, kann man die repaint() Methode irgendwie 
verlangsamen oder gibt es eine bessere Möglichkeit die gezeichneten 
Objekte immer wieder zu aktualisieren?

Vielen Dank.

: Verschoben durch User
von Lukas B. (mind)


Lesenswert?

Ich habe mein Problem selber gelöst. Für alle die es interessiert:
Ich habe super einfach einen Timer erstellt, der jede 100ms aufgerufen 
wird und repaint() ausführt.

: Bearbeitet durch User
von Alex G. (dragongamer)


Lesenswert?

Ehrlich gesagt würde ich dir empfehlen eine andere Engine für Games zu 
nehmen als Java!
Minecraft ist ein gutes Negativbeispiel. Trotz der Klötchengrafik 
erreicht man kaum 70 oder 80 FPS mit nem Gamingrechner.

JavaFX ist für GUIs gedacht. Nicht für Games.

Wenn du Java kannst, wirst du dich binnen Wochen in C# einarbeiten 
können.
Damit kannst du prima in Unity programmieren - einer richtigen Game 
Engine.


Lukas B. schrieb:
> Ich habe mein Problem selber gelöst. Für alle die es interessiert:
> Ich habe super einfach einen Timer erstellt, der jede 100ms aufgerufen
> wird und repaint() ausführt.
Toll, damit hast du ein Programm das mit 10FPS läuft...

: Bearbeitet durch User
von Lukas B. (mind)


Lesenswert?

Alex G. schrieb:
> Toll, damit hast du ein Programm das mit 10FPS läuft...

Könnte es locker noch ohne Probleme auf 5ms runter stellen ohne das der 
Lüfter von meinem MacBook zu höheren ist. Aber für den derzeitigen Stand 
brauche ich nicht mehr als 10FPS.

C# läuft aber auf macOS nicht. Da bräuchte ich wieder eine VM auf der 
Windows läuft...

von Jim M. (turboj)


Lesenswert?

Lukas B. schrieb:
> C# läuft aber auf macOS nicht.

Da irrst Du Dich aber gewaltig. Es gibt von Unity einen MacOS Port, und 
das basiert auf C# (in Form von Mono).

von Cyblord -. (cyblord)


Lesenswert?

Oh je.
Das kommt dabei raus wenn Apple Hipster sich an Spieleentwicklung 
machen.

von Ich (Gast)


Lesenswert?

Ich kenne mich mit Java nicht aus, aber fix alle 100ms einen repaint zu 
triggern halte ich in der heutigen Zeit für grundlegend falsch:

- Es wird alle 100ms gezeichnet, auch wenn es nicht notwendig wäre
- Was, wenn ein das zeichnen mal mehr als 100ms dauert?

Zeichnest du denn immer alles neu, oder könnte man nur gewisse Regionen 
aktualisieren? Double Buffering möglich?
Werden beim Zeichnen aufwendige Operationen ausgeführt, die man 
auslagern könnte?

von Olle Ihmchen (Gast)


Lesenswert?

Schon mal LWJGL angeschaut?

https://www.lwjgl.org/

von Thorben R. (camyono)


Lesenswert?

Moin,

da leider kein Quellcode angegeben ist, kann ich Dir folgende Antwort 
bieten:

https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#repaint-long-

Die Component-Klasse und alle ihrer Ableitungen enthalten auch die 
repaint-Methode mit dem long-Parameter. Dieser sorgt für die von Dir 
gewollte Verzögerung.

Denk daran: Der EDT wird durch das Warten auf AWT oder Swing-Komponenten 
blockiert. Daher: EventQueue.invokeLater(new Runnable() { ... });

Übrigens um einige Antworten zu ergänzen:
1. Java eignet sich für die Spiele-Entwicklung (bis zu einem gewissen 
Grad) 2. Wie Olle Ihmchen schon schreibt: Die LWJGL-Bibliothek wäre 
hierfür ein hervorragender Kandidat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.