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 Moderator
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.