Timer?

cybren

Mitglied
Hallo, ich habe ein Programm geschrieben und ich habe es an einem Langsamen und ein einem sehr schnell Pc ausprobiert. In dem Programm gibt es Animationen die durch for-loops getimed werden. Das Problem: die for-loops sind natürlich nicht bei beiden Pcs gleich schnell abgearbeitet und damit wird die animation entwerder zu langsam oder zu schnell. Meine Frage: gibt es noch irgendwas womit man dem Programm sagen kann das es den nächstem Befehl erst nach dieser Zeit machen soll?
P.S.: bitte kein Thread.sleep da friert sich bei mir ür die zeit einfach gleich alles ein!
MFG cybren
 

Joose

Top Contributor
Meine Frage: gibt es noch irgendwas womit man dem Programm sagen kann das es den nächstem Befehl erst nach dieser Zeit machen soll?


Ja
Code:
Thread.sleep
:)
Aber lies hier mal in dem Bereich Spiele Programmierung => DELTA für die Zeichenloop
Damit sollte es dir möglich sein die Animationen auf beiden PCs gleich ablaufen zu lassen.

P.S.: bitte kein Thread.sleep da friert sich bei mir ür die zeit einfach gleich alles ein!
MFG cybren

Jap weil du wahrscheinlich den GUI Thread schlafen legst welcher aber gebraucht wird um Eingaben auf der GUI entgegen zunehmen.
Du musst diese Animationen in einen extra Thread auslagern und diesen stoppen!

Multithreading mit GUI
 
Zuletzt bearbeitet:

Ruzmanz

Top Contributor
Timer hilft nicht viel. Tatsächlich sollte man wie vorgeschlagen nach " DELTA für die Zeichenloop" suchen. Warum bringt der Timer nichts? Bei einem festen Wert:

Schneller PC:
- doLogic (14ms)
- sleep (20ms)
- doLogic (14ms)
- sleep (20ms)
- doLogic (14ms)
- sleep (20ms)

Langsamer PC:
- doLogic (38ms)
- sleep (20ms)
- doLogic (38ms)
- sleep (20ms)
- doLogic (38ms)
- sleep (20ms)

Sofern du die Maximale Bearbeitungszeit auf 100ms legst:
- doLogic (38ms)
- sleep (100ms-38ms)

Problem an der Geschichte ist, dass Thread.sleep() nicht garantiert, dass es sofort weiter geht. Vielleicht puffered die CPU grade dein Youtube-Video im Hintergrund und schaltet deine Applikation beim schnellen PC immer nach 2ms zurück und beim langsamen nach 7ms. Schon bei einer geringen Spielzeit fällt das enorm ins Gewicht.
 

cybren

Mitglied
Ok heißt das, dass ich es niemals schaffen werde das es auf beiden Pc gleich schnell bzw auf beiden Pc gleich einfach wird? ich meine zwar wenn es nur um ms geh tis es ja nicht so schlimm...
 

Bananabert

Bekanntes Mitglied
Moin,

du könntest dein Update einen Fixed-Timestamp verpassen. Wenn es hinterher hängt, holt es Updates nach, sodass pro Sekunde z.B. dein Spiel immer 20 geupdated wird.
In deiner Render-Methode könntest du ein Frameskip einbauen. FPS auf unlimited setzen und "Motion Interpolation" einbauen. Auf langsamen PC's wird es zwar zu rucklern kommen, aber das Spiel läuft immer mit der selben Geschwindigkeit. Und auf schnellen PC's wird es mit steigender FPS immer flüssiger durch die "Motion Interpolation".
 

Bananabert

Bekanntes Mitglied
Moin,

nein.

Ich hab das z.b. immer so gemacht am Anfang: (pseudo code)

Java:
final Long HERTZ = 1000000000L / 30L; 	// nano sekunden pro update, hier 30 updates die sekunde
Long lastUpdate = System.nanoTime();
Long now = last;
Double delta = 0D;

while (isRunning) {
	now = System.nanoTime();
	delta += (now - lastUpdate) / HERTZ; // gibt einen wert zwischen 0 und 1 zurück
	last = now;
	// wenn delta >= 1 ist, ist die zeit von HERZT vergangen und es muss wieder geupdated werden. 
	while (delta >= 1) {
		update();
		delta--;
	}
	render();
}

Das Snippet ist nicht Performance optimiert, da solltest du ein wenig schauen.
Aber im Grunde, wird dein Spiel so lange geupdated, bis es auf dem richtigen Stand ist. Danach wird einmal gerendert. Auf einem schnellen PC's wird es wenig bringen, da kannst du nach "Motion Interpolation" googlen.
Auf langsamen PC's wird sich ein Objekt so schnell bewegen wie eines auf einem schnellen, nur die Darstellung wird ein wenig von Punkt zu Punkt "springen".

Google einfach mal ein wenig nach "java gameloop" dort wirst du sehr viele verschiedene Herangehensweisen finden für die Implementierung eines Gameloops.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Timer terminiert nicht Allgemeine Java-Themen 5
W Timer Konzept-Frage Allgemeine Java-Themen 16
Z Timer Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
Tacofan Kurzer Timer Allgemeine Java-Themen 22
B Threads Timer wird immer schneller Allgemeine Java-Themen 6
H Consumer (Java8 Lambda) an Timer übergeben Allgemeine Java-Themen 2
wolfgang63 Best Practice Taktgeber oder Timer mit variablem Intervall Allgemeine Java-Themen 1
I Timer Allgemeine Java-Themen 1
X Timer Allgemeine Java-Themen 3
U Timer - Timertask endet nicht Allgemeine Java-Themen 4
X timer.schedule - Allgemeine Java-Themen 7
D Simpler Timer zum warten Allgemeine Java-Themen 19
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
G Threads Timer wird unterbrochen Allgemeine Java-Themen 20
P Java Timer Allgemeine Java-Themen 3
K Timer Thread Allgemeine Java-Themen 8
E Wie Timer anbringen mit Designer in Netbeans Allgemeine Java-Themen 5
M Ampelsteuerung über Timer in Java realisieren Allgemeine Java-Themen 3
O Timer pausieren Allgemeine Java-Themen 5
M Timer von nicht existiertem Objekt stopen Allgemeine Java-Themen 5
B util.Timer zu langsam? Allgemeine Java-Themen 3
P Java Timer Allgemeine Java-Themen 2
S Timer in Applet? Allgemeine Java-Themen 11
G Swing Timer führt Methode nicht aus Allgemeine Java-Themen 2
V Frage zu util.Timer (-> TimerTask) Allgemeine Java-Themen 2
P Swing Eine Sekunde warten (Timer) Allgemeine Java-Themen 7
E Timer class macht einfach garnichts :/ Allgemeine Java-Themen 6
T Timer oder Alternative? Allgemeine Java-Themen 3
Z Timer -> Thread jeden Tag ausführen Allgemeine Java-Themen 5
D Probleme mit einem Timer Allgemeine Java-Themen 6
E Timer - gleichen Task mehrfach planen Allgemeine Java-Themen 2
D Timer oder Thread, das ist hier die Frage Allgemeine Java-Themen 3
A TimerTask - Task stoppen - timer.cancel() funktioniert nicht Allgemeine Java-Themen 8
S Problem mit einem Timer (Aktualisierung etc.) Allgemeine Java-Themen 2
B Timer übergabe Allgemeine Java-Themen 3
G Timer abbrechen und neu starten Allgemeine Java-Themen 3
G timer mit buttondruck abbrechen Allgemeine Java-Themen 7
T Timer oder ähnliches? Allgemeine Java-Themen 3
O Timer und TimerTask: Programm terminiert nicht! Allgemeine Java-Themen 3
O Thread als Timer Interrupt Allgemeine Java-Themen 2
C Timer.scheduleAtFixedRate(). Allgemeine Java-Themen 5
H gibts in Java sowas wie in Visual Basic den Timer? Allgemeine Java-Themen 5
B 24 Uhr Timer Task Allgemeine Java-Themen 5
G Timer nur 64 mal pro Sekunde? Allgemeine Java-Themen 18
S Frage zu jTDS, JAVA allgemein und Timer Allgemeine Java-Themen 6
L Problem mit Timer Allgemeine Java-Themen 7
J Timer-Objekt / Task-Zustand ermitteln Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben