Gibt es den nichts besseres als sleep() ?

Status
Nicht offen für weitere Antworten.

AlexDozer

Aktives Mitglied
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
 

AlexDozer

Aktives Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

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

Templon

Bekanntes Mitglied
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

Bekanntes Mitglied
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.
 

AlexDozer

Aktives Mitglied
@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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Aktives Mitglied
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
 

AlexDozer

Aktives Mitglied
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

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben