Java - repaint() Verlangsamen

OP #5489944
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.
#5489959
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...
OP #5489988
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...
Gast #5490733
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?
#5499710
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren