# Gibt es den nichts besseres als sleep() ?



## AlexDozer (21. Mai 2008)

Hi,

ich stehe hier vor dem Problem, wie manch andere wahrscheinlich auch, das mein Spiel nicht rund läuft. Nach einigem rumtesten hab ich rausgefunden das es die Methode Thread.sleep() ist die unsauber arbeitet und ich somit nicht konstante FPS habe. 

Nach einigem rumforschen scheint das ja normal zu sein. Bloss nirgends steht ne Lösung wie man es besser machen könnte. 

Gibt es den wirklich keine andere Lösung welche besser funktioniert? Wie machen es denn die Professionellen Spieleschmieden?


Gruß Alex


----------



## L-ectron-X (21. Mai 2008)

Vielleicht mit Timer und TimerTask?


----------



## AlexDozer (22. Mai 2008)

Hast du Erfahrungen damit? Also obs damit besser geht oder nicht mein ich 

Werde ich auf jeden Fall mal ausprobieren, bloss das jetzt in meinem aktuellen Projekt einzubauen 
wird zu viel. Hab ja nicht mehr viel Zeit


----------



## der JoJo (22. Mai 2008)

Normaler Weise wird bei der Spieleprogrammierung gar kein sleep oder wait oder sonst was verwendet, siehe 999 FPS bei Alten shootern wie q3a

Man misst einfach die Zeit die zwischen 2 Frames vergangen ist, und bewegt dann alles entsprechend weit.


----------



## EgonOlsen (22. Mai 2008)

der JoJo hat gesagt.:
			
		

> Man misst einfach die Zeit die zwischen 2 Frames vergangen ist, und bewegt dann alles entsprechend weit.


Muss man nicht. Man kann die Spiellogik auch völlig von der Framerate abkoppeln. Davon abgesehen kann ein Sleep dennoch sinnvoll sein, wenn man die Framerate nicht braucht und die CPU nicht auf 100% (oder auf heutigen Quadcores dann eben auf 25%) laufen lassen will/kann.

Was genau soll der Sleep in diesem konkreten Fall denn tun? Eine konstante Framerate produzieren?


----------



## Templon (22. Mai 2008)

Ich habe das auch immer so gemacht, dass ich die bewegung abhängig von der zeit des letzten Durchganges von meinem Game-Loop gemacht habe. Und dann noch ein Thread.Sleep(20) oder Thread.Yield() eingebaut habe, damit mein Programm nicht 100% CPU frisst.


----------



## der JoJo (22. Mai 2008)

wenn es sich um ein Spiel handelt, ist es doch aber sinnvoll 100% der CPU auszunutzen, oder nich?


----------



## Templon (22. Mai 2008)

Bei mir waren es 2D-Spiele, glaube nicht das es da nötig wäre. Heute brauchen auch modernste 3D Spiele nicht mehr 100% soweit ich weiss.


----------



## EgonOlsen (22. Mai 2008)

Templon hat gesagt.:
			
		

> Bei mir waren es 2D-Spiele, glaube nicht das es da nötig wäre. Heute brauchen auch modernste 3D Spiele nicht mehr 100% soweit ich weiss.


Doch, eigentlich schon noch. Nur das das in Zeiten von Multicore nicht mehr so auffällt. Ich kann zocken, was ich will...wenn ich die CPU-Auslastung überwache, liegt die immer bei min. 25% (also 1 Kern komplett belegt). Manche Spiele schaffen auch 50%, also 2 Kerne komplett belegt. Viel mehr habe ich noch nicht gesehen.


----------



## Templon (22. Mai 2008)

Ja stimmt, hab ja auch einen dual core Prozessor, nicht mehr daran gedacht


----------



## AlexDozer (22. Mai 2008)

@der Jojo: Interessanter Ansatz! Wie schwer ist sowas? Haste vielleicht ein Code-Beispiel?

@EgonOlsen: Ja, das sleep ist bei meinem Spiel dazu da eine konstante Framerate zu produzieren da alles 
an die Framerate angekopplet ist also die Bewegung der Objekte. 

Wer sich ein aktuelles Bild machen will kann gern mal ne Runde zocken: www.alexdozer.de/ballerspiel

Wie man sieht läuft es nicht wirklich flüssig sondern hängt ab und zu leicht bzw wird schneller & langsamer.



Gruß Alex


----------



## manuche (22. Mai 2008)

Bei mir läufts doch recht flüssig...
Also für Minigames würde ich die variante bevorzugen, die Zeit zwischen 2 Frames zu berechnen!
Wäre also das einfachste...

Was du gegen Framerate einbrüche machen kannst ist die Zeit des sleeps zu senken... Allerdings nich zu stark! Ich hab die Erfahrung gemacht, dass sich mein Rechner dann immer ein wenig an dem abzuarbeitenen Code verschluckt xD


----------



## EgonOlsen (22. Mai 2008)

Läuft bei mir flüssig und ohne Geschwindigkeitswechsel. Ich würde niemals auf eine konstante Framerate setzen. Manche machen das auch mit Vysnc...ganz toll für Leute wie mich, die das immer ausgeschaltet haben... :wink: 
Mach es besser über eine Art Ticker, der die Spielzeit vorgibt und von der Bildrate unabhängig ist oder miss halt die Zeit eines Frames. Nur nicht mit currentTimeMillis(), weil die Auflösung nicht reicht.


----------



## AlexDozer (22. Mai 2008)

Momentan mach ich es ja so das ich messe wie lange der Thread gebraucht hat und dementsprechend
den Thread pausiere. So das jeder Durchgang die selbe Zeit braucht. 

Das Problem ist ja nur das sleep() nicht immer genau die Zeit wartet was es eigentlich machen sollte! 


Gruß Alex


----------



## EgonOlsen (22. Mai 2008)

Wie misst du denn?


----------



## AlexDozer (22. Mai 2008)

Ich messe wenn der die Schleife mit System.nanoTime() und am Ende wieder. Dadurch weis ich wie lange die Schleife gebraucht hat. Das ziehe von einer vorgegebenen Zeit, welche sich aus sec/fps ergibt ab und weise die Restzeit sleep() zu. Somit müsste eigentlich in regelmässigen Abständen die Schleife von vorne beginnen! 

Aber sleep() wartet nicht immer die Zeit ab die es sollte! Das schwankt teilweise ganz schön ich gemerkt.


----------



## EgonOlsen (23. Mai 2008)

Wenn du weißt, welche Framerate du haben willst, dann häng doch die Spiellogik an einem extra Timer dafür auf. Dann kannst du immer noch die Sleeps machen (was bei einem Applet sicher auch sinnvoll ist), aber bist nicht mehr davon abhängig, dass sie ganz exakt sind.


----------



## AlexDozer (25. Mai 2008)

Welche Frameraten lassen sich mit Timer realisieren? Würden 100fps noch gehen oder währe das schon zuviel?


----------



## AlexDozer (25. Mai 2008)

Hab grad ein einen schönen Kapitel in dem Buch "Killer Game Programming in Java" gefunden. Da gehts genau um dieses Thema mit mehreren Ansätzen. Ich denke da ist was für mich dabei 

In meinem Fall gibts bei 6 ne schöne Lösung. Das ich da nicht selber drauf gekommen bin :roll:

Hier das Kapitel: https://fivedots.coe.psu.ac.th/~ad/jg/ch1/ch1.pdf
Und hier das Buch: https://fivedots.coe.psu.ac.th/~ad/jg/

Gruß Alex


----------

