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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.