# Bestimmung der Sleeptime



## acine123 (29. Nov 2015)

Hallo,
Ich beschäftige mich derzeit mit der GameLoop und habe verschiedene Methoden zur bestimmung der Sleeptime gefunden. 

1. Vergangene Zeit merken und davo  ausgehend warten bid zum nächsten durchlauf

2. laufen lassen und die aktionen nach real time aktualisieren

...

Meine Frage ist jetzt. Kann mir jemand sagen wo die Vorteile liegen bzw was meistens für normale Games (Jump n' run, etc) eingesetzt wird. Wenn ihr ein Tutorial oder Guide habt würde ich mich auch freuen. 

Ich bin nach der ersten Methode vorgegangen bekomme aber wie in einem anderen Thread schon beschrieben auf dem Gaming PC & Laptop ca alle 2 Sekunden einen ruckler.

mfG Acorro


----------



## Takar110 (30. Nov 2015)

Ich bin selbst noch Anfänger, habe aber schon ein paar Spiele fertig. 
Bisher habe ich immer Thread.sleep(_Zeit_); verwendet. Das funktioniert bei mir ziemlich gut und wenn ich mit Pixeln arbeite (statt z.B. mit Arraypunkten) läuft es auch flüssig.


----------



## acine123 (30. Nov 2015)

Hast du dabei auch die Anfangszeit + benötigte Zeit -Jetzige Zeit gerechnet? Fände es cool wenn du den Code aus meinem anderen Thread (wo es um das ruckelnde Viereck geht) auch einmal ausprobieren, und schauen könntest ob er bei dir funktioniert. Und ob du es auch so gemacht hättest.


----------



## Takar110 (30. Nov 2015)

Bei deiner Rechnung kommt doch immer 0 raus oder nicht?  
Das Viereck werde ich mir nachher mal raussuchen


----------



## Times (30. Nov 2015)

Hey,

in den meisten Spielen wird kein Sleep im GameLoop verwendet. Je öfter du durchläufst desto mehr FPS kriegst du auf die Reihe und desto mehr Spaß haben die Spieler 

Edit: Dies ist aber soweit ich weiss nur mit Spielebiblitheken möglich die mit OpenGL etc. arbeiten. Direkt über Java sprich mit Swing etc. könnte das Problemematisch werden, da du zB in LWJGL das Display, sprich dein Spielefenster mit jedem Durchlauf updatest, du aber in Java selber also mit Swing davon ausgehst das Java das Swing-Fenster selber updatet, was mit einem Thread der andauernd läuft schwierig werden könnte.


----------



## acine123 (30. Nov 2015)

Bei den meisten Spielen kann doch aber eine Maximale Framerate festgelegt werden. In spielen wie zB. Minecraft will man ja gar nicht 200FPS haben. Dabei braucht man doch auch eine Sleeptime.

Zu Takar. Ja die Rechnung habe ich falsch geposted (peinlich ^^). Gemeint ist natütlich Anfangszeit+1000/fps-Aktuelle Zeit

Das komische ist, dass ich das selbe Problem in Javascript mit Canvas habe. Es aber in der Schule (mittelgute PC's) flüssig laufen während auf meinem sehr gut konfigurierten PC und meinem Laptop ruckler entstehen. Sie wirken eigentlich nicht wie ruckler sondern wie kleine stopper oder sogar Rücksprünge


----------



## Times (30. Nov 2015)

acine123 hat gesagt.:


> Bei den meisten Spielen kann doch aber eine Maximale Framerate festgelegt werden. In spielen wie zB. Minecraft will man ja gar nicht 200FPS haben. Dabei braucht man doch auch eine Sleeptime.



Da magst du recht haben, aber das macht das Spiel irgendwo im Hintergrund. 
Wie genau LWJGL das macht kann ich leider nicht sagen da der Code nicht einsehbar ist.
Die Methode die es da macht heisst "Display.sync(MaxFPS)", aber ich könnte mir eine Rechnung in folgender Art vorstellen:

<btw: Die Methode wird in jedem Durchlauf einmal aufgerufen>

SleepTime = 1000 / [Gewünschte FPS] - [Zeit vergangen seit letztem Aufruf in MS]


----------



## Major_Sauce (30. Nov 2015)

Nabend,

immer mit "Realtime" arbeiten.
Eine vernünftige Gameloop misst die Zeit zum letzten Update und berechnet dann relativ dazu die Positionen oder Attribute.
Ganz einfaches Beispiel:
Wenn man einfach Thread.sleep benutzt, und dann sagt beweg den Spieler um eine Längeneinheit nach rechts, dann kann das bei 50 Leuten gut gehen, beim 51. aber nicht.
Wieso ? Ganz einfach. Nicht jeder Rechner ist gleich schnell und es gibt auch zeiten an denen der Rechner einfach mal kurzzeitig ausgelastet ist. Dann wartet der Rechner bei einem .sleep(10) vielleich mal 12 oder 13 Millisekunden, oder auch nur 9. Was ich sagen will ist, es gibt immer abweichungen.
Wenn wir nun im Multiplayer unterwegs sind, gibts bei einem viellecht 60 Updates in der Sekunde, er wird also um 60 Längeneinheiten. Meiner ist ein bisschen langsamer, und ich habe nur 40 Updates in der Sekunde, bin also nur 40 Längeneinheiten weit gelaufen.
Und hier ist das Problem. Wenn man einfach mit einem sleep arbeitet, wird das Spiel für manche Leute unspielbar sein, nur weil sie einen etwas schlechteren Rechner haben oder Windows/Linux oder was auch immer, gerade ausgelastet ist.

Das selbe mit der Differenz der Updatezeiten:
Ich habe einen guten Rechner, zwischen 2 Updates vergehen immer 10 ms, * 0.1 -> ich laufe eine Längeneinheit. In einer Sekunde sind das 100 Updates -> 100 Längeneinheiten die Sekunde
Ich habe einen schlechten Rechner, zwischen 2 Updates vergehen 20 ms, * 0.1 -> ich laufen 2 Längeneinheiten. In einer Sekunde 50 Updates -> 100 Längeneinheiten.

Hier bin ich nun, egal wie gut meine Performance ist, immer gleichschnell unterwegs.

mfg Major


----------



## acine123 (30. Nov 2015)

Danke für die guten Antworten. Ich werde vermutlich mit Realtime arbeiten. 
Was mich aber dennoch stört ist dass das Viereck (In meinem andreren Thread angesprochen) auf meinem doch sehr guten PC bei 60 und auch bei 30 fps (fps anzahl egal) jede Sekunde einen kurzen zürückruckler hat. Es scheint als würde es jede Sekunde eine Teleportation von ein paar Pixeln machen. 
Da ich mir nicht vorstellen kann, dass das mit der Performance des PC's zusammenhängt, muss es doch einen anderen Grund haben.


----------



## InfectedBytes (30. Nov 2015)

und den entsprechenden code zu kennen, kann man nur rumraten... ^^


----------



## acine123 (30. Nov 2015)

Hier der komplette Thread (inkl. Code):
http://www.java-forum.org/thema/bewegendes-viereck-ruckelt.170603/#post-1073333


----------

