# Frame Timing



## Kr0e (10. Jun 2008)

Ich weiß, diese Frage wird oft gestellt aber nur sehr selten bekommt man gute bzw befriedigende antworten:
Wie kann professionelles Timing regeln ? Sprich keine Framebremse aber auch keine 100% Prozessorauslasung zumindest nur wenn es auch wirklich notwendig ist!
Also wie wird das bei Spielen wie z.b. CounterStrike geregelt ? Gibt es da iwo eine Framebremse ? Ich meine mehr als 100 FPS gehen da auch nicht. Mir ist klar dass man z.b. die Dauer von der verstrichenen Zeit des Renderns als Bewegungsfaktor benutzen kann... Aber ich will iwo auch nicht 100 % Prozessorauslastung wenn ichs sie niht brauche, aber timer sind auch hässlich bei sowas. Falls man dann doch mal mehr Ressourcen braucht ist der Timer wieder zu "lahm". Also wie macht man sowas ? Wie regeln sowas professionelle Spieleprogrammierer ? Ich mein es gibt ne Reihe von Spielen wo die Aulastung bei z.b. ... 40 % oder 60 % liegt... zb. BattleField2.... und keine Sorge ich hab nur nen SingleCore  Also wie macht man sowas ?

Gruß Chris und schonmal vielen viel Dank im Voraus! Ich hab da im Moment iwie keine Idee....


----------



## Siassei (10. Jun 2008)

Hallo Chris,

naja. In Spielen wie BF oder CS gibt es wohl eine intelligentes Aufgabenmanagment. Soll heißen: Es werden Aufgabe wenn möglich bereits im vor hinein bearbeitet und umgesetzt. Zudem ist die Dauer eines "Lebenszyklus" auf eine gewisse Dauer begrenzt ->
- können alle Aufgaben innerhalb dieser Zeit erledigt werden, hat die CPU pause 1% - 99 % CPU Auslastung
- falls nicht -> CPU 100% und es kann sogar die Framerate sinken, da die vorhandenen Kapazitäten für die Aufgaben und  nicht für die Grafikdarstellung benutzt werden.

und und ... (Spieleprogrammieren ist echt schön und sehr lernreich)

für den Zyklus solltest du dir mal Quartz, RealTime in Java (Sun), ... ansehen


----------



## Kr0e (10. Jun 2008)

Danke Siassei!

Ich programmiere zur Zeit ein Programm dass im Prinzip 2D Bälle mit einander kolliedieren lässt. Aber auch mit Massen und Gravitation. Das braucht natürlich alles sehrrrr viel Rechenzeit wenn man 100> Bälle hat! Vorallem wenn man will, dass die Bälle bei sehr heor Geschwindigkeit nicht durch Bälle die einen kleineren Radius haben als die Geschwindigkeit des anderen Balls! Ich hatte dies zuvor im Rahmen eines Schulprojekts gemacht, allerdings bestand meine Lehrerin darauf ALLES in Delphi zu machen, wovon ich nicht sehr halte. Wiedem auch sei, ich wusste nicht wie man mit Delphi 7 Threads erstellt ... Geht das überhaupt XD  ? .. egal... Auf jeden Fall wollte ich das Ganze noch etwas "perfekter" in Java und OpenGL umsetzen da ich hier eh Grundkenntnisse aus C++ habe. Und nun stehe ich vor dem Problem, ob ich
- du sagtest ja "intelligentes Aufgabenmanagment" - einfach den NAchteil mit der 100% Auslastung hinnehme oder ich versuche CPU Zeit zu sparen, wenn vlt weniger Bälle als 50 da sind und die Rechenzeit nicht derart in die Knie gehen sollte. Hsat du oder irgendwer eine MEninug zu ? Oder Tipps bzw Anregungen ?

PS: Oder bzw ... Diese CPU Pause iwie realisiere bzw WIE ? Also ich meine wie kann man die CPU für einen Augenblick "schlafen" legen ? Und zwar ohne sleeo() 

Gruß Chris


----------



## Siassei (11. Jun 2008)

> Hsat du oder irgendwer eine MEninug zu ? Oder Tipps bzw Anregungen ?


Falls du ein Buch, Tutorial, ... meinst, leider nein, aber Google hat eine Menge davon.



> - du sagtest ja "intelligentes Aufgabenmanagment" - einfach den NAchteil mit der 100% Auslastung hinnehme oder ich versuche CPU Zeit zu sparen, wenn vlt weniger Bälle als 50


Hä  :?: Weniger Bälle = Weniger Arbeit = Weniger CPU-Auslastung ; das ist doch nicht dein ernst.

Hast du dir nun bereits ein Konzept überlegt oder wartest du auf eine Antwort von mir?


----------



## Kr0e (11. Jun 2008)

Nein ich erwarte doch keine Antwort von dir  Aber wenn du willst kansnt du was dazu sagen 
DAs mit weniger Bälle weniger Auslastung ist eher ein optimal Beispiel, ich will kein Konzept von dir  Aber fragen schadet nicht, vlt weißt du ja in der hinsicht mehr  Und dann lass ich mich gerne belehren 

Gruß Chris


----------



## Siassei (11. Jun 2008)

Jeep, fragen schadet nie  :wink: 

Was hast du den? Du musst ja schon was haben, wenn du's bereits mit Delphi eine Lösung erstellt hast. Oder war das nur eine Möglichkeit die sich deine Lehrkraft gewünscht hat? Wie soll ich dir sonst auch nen Tip geben, außer ein paar allg. grümmel.


----------



## Kr0e (11. Jun 2008)

Also ich habe die gesamte Physik, sprich Klassen um alle physikalischen Vorgänge die wichtig sind zu berechnen. Ich habe die GRafikklassen sprich ich hab Sachen Kollisionerkennung und das zeichnen der Bälle. GEregelt mit JOGL. So aber das problem liegt ansich an der "zussammensetzung" aller Klassen. Also ich wüsste z.b. wie ich am besten die ganzen Sachen zeitlich regele. Ich mein wenn ich die Variante mit dem "ungebremsten" Programm nehmen würde wäre ich fertig. Damit hab ich die höchste Performence die jeder Rechner bringen kann. Aber ich bin damit halt einfach noch niht so zufrieden. Ein Timer hat das problem nur ansatzweise gelöst, dar der Thread.sleep(0, 1000) im nanobereich ungenauer als der Zufall ist und der normale timer... naja.. nur im ms bereich klappt. Naja ok ich werde das Problem mit der 100% Prozessorauslastung einfach hinnehmen wenns nicht anders ghet 

Gruß Chris


----------



## Siassei (11. Jun 2008)

Hört sich doch schon mal viel versprechend an.

- "Ich mein wenn ich die Variante mit dem "ungebremsten" Programm nehmen würde wäre ich fertig" So, damit meinst du wohl eine while-Schleife die von neu beginnt, wenn sie am Ende angelangt ist. Das überrascht mich sehr. Du hast vorher etwas von Physik erzählt (wenn mich nicht alles täuscht  ???:L ). Wie rechnest du da? Ich bin nicht gerade der besten Physiker  aber in der Physik spielt die Zeit eine große Rolle. Naja, vielleicht etwas später mehr.

- "Damit hab ich die höchste Performence die jeder Rechner bringen kann." Pass auf was du sagst. Performance, was war das gleich noch mal ???:L Ah ja

- "Aber ich bin damit halt einfach noch niht so zufrieden." Ein dickes Lob von mir  :applaus: Nun las uns mal überlegen wie z.B. BF 2 (was ich gerne Zocke) oder andere 3D-Spiele das Problem gelöst haben. Die Antwort ist eigentlich ganz einfach. Die Game-Engine [Physik, (Kollision), Netzwerk, ...] ist nicht mit der Grafik-Engine gekoppelt.
-> die GameE läuft mit einer niedrigeren Taktung als de GrafikE und hat zudem noch ein kleines Zeitfenster

So, wie verhindert man nun das Ruckeln am Bildschrim? Die große Frage und was zur Zeit eingesetzt wird kann ich dir nicht sagen (weiß es selber nur bruchstückhaft). Jedoch eine schon lange bekannte Technik ist das Morphing.
Funktionsweise:
- die GameE berechnet für alle Objekte eine ungefähre Position die das Objekt nach der Zeit n einnehmen wird, wenn ansonsten keine weitere Actionen auftreten (z.B. Benutzereingaben, KI-Aktionen, ...)
- die GrafikE nähert sich der Zeit n nach i Schritten. Mit dieser Information berechnet die GrafikE eine Objektposition für die aktuelle Zeit aus der letzten Position (die von der GameE stammt) und der Position nach der Zeit n
- In der Zwischenzeit werden alle eingehende Actionen bearbeitet und die exakte Position aller Objekte zur Zeit n (aus 1.) berechnet
- kurz vor dem erreichen der Zeit n wird der 1. Schritt wieder ausgeführt und die Positionen aus dem vorherigen Schritt als letzte Position der GameE gekennzeichnet


Im Falle von BF 2 akzeptieren die meisten Serverbetreiber nur Pings bis zu 150ms. Falls sich dieser kurzzeitig höher befindet wirst du vom Server gekickt. Begründung: Performance Einbruch + nicht mehr spielbar. Ich spiele meistens mit einem Ping von 40-70 ms. Ab und zu kommt auch ein konstanter Ping von 100 - 120 ms vor. Hier beobachte ich immer wieder ein leichtes Ruckeln was auf das Netzwerk zurück zu führen ist. Warum schreibe ich das hier eigentlich?

Nehmen wir mal an:
- Ich habe einen Ping von 100ms und ein weiterer Client ebenfalls

So, nun führt der Client eine Aktion aus und sendet sie zum Server (Zeit ca. 60ms) und der Server sendet sie mir (Zeit 60ms). Jetzt war alleine die Aktion 120ms unterwegs bis mein Programm es verarbeiten kann. BF 2 wandelt nun die Aktion in ein Arbeitspaket und verarbeitet es. Erst wenn die Aktion gültig und erfolgreich verarbeitet wurde ist es der GrafikE bekannt und wird dargestellt.

Im oberen Abschnitt habe ich mal was von einem Zeitfenster und im letzten Abschnitt das Wort Arbeitspaket benutzt.
Konzept Arbeitspaket: Jede Aktion im Spiel wird in einen Arbeitspaket gewandelt undmit einem Timestamp signiert. Die GameE hollt die Arbeitspakete aus einer Schlange und arbeitet sie nach und nach ab, sofern das aktuelle Paket nicht bereits aus dem Zeitfenster gefallen ist (Zeitfenster > aktuelle Zeit - Timestamp).
Der Vorteil liegt auf der Hand. Die Taktung der GameE wirkt sich nicht auf die Aktionen aus, es müssten ledeglich eine History bis zur aktueller Timestamp - Zeitfenster geführt werden und bei einer Aktionen nach gerechnet werden. Womit wir schon beim Nachteil sind, ein höherer Speicherbedarf im RAM 

Vielleicht noch zwei Zahlen zur Orentierung:
- GameE alle 100ms
- GrafikE je nach Usereinstellung zwischen 60 und 100 Herz.

Ich schreibe und schreibe, aber helfen tut es dir sicherlich nicht viel. Sende mir mal deine Source an die E-Mail Adresse und ich sehe mir ihn mal. Vielleicht kann ich dir einen Tip geben  Doch versprechen kann ich nichts. Morgen Spielt ja Deutschland  und die Schweiz wird wohl 1:1 spielen. Zumindestens in der 88. Minute


----------



## Siassei (11. Jun 2008)

Ach ja, hast du RealTime und Quartz nachgeschlagen?


----------



## Kr0e (11. Jun 2008)

Hey, danke für diese ganzen Infos!! Ja, ich habe mir Quartz und RealTime angeschaut. Aber ich denke dass mich dein Beitrag hier nun weiter gebracht hat. Ich sehe das Problem nun anders... . Den Quellcode des Javaprogramms kann ich dir leider nicht schicken, da meine Teamkollegen dies noch "geheim" halten wollen(Sry, das hab ich garnicht erwähnt xD). Bzw. es erst "fertig" stellen wollen. Ich kann sie da irgendwo verstehen, und es macht doch merh spaß es zu erstehen und zu lernen als es gesagt zu bekommen, bzw die Lösung! (nicht für ungut!! Ich schätze deinen Enthusiamus hier sehr !). Dank deinen ganzen Informationen bin ich schon mit dem GRundproblem weiter gekommen, sprich ich sehe es anders und das erlaubt mir es auch anders anzugehen. Da ich für Grafik und teils für Physik zuständig bin, muss ich dieses Problem leider lösen. Ich hatte dieses Problem auch schon damals als ich kleine Simulationen unter C++ & OpenGL geschrieben hab, doch hab ich mich damals nciht sehr drum gekümmert, da auch die NeHe-Tuturials dies nicht erklären.
Nachdem ich weitesgehend alle bzw die wichtigsten durchgearbeitet hatte, blieb aber die Frage und ich hab mich dann leider nicht mehr genau damit beschäftigt. Nun kam diese Frage wieder auf, da ich es diesmal "perfekter" machen wollte. Aber ich denke ich hab nun einige Ansätze wo ich mir was ausdenken kann. Ich bedanke mich für deine Hilfe! Falls du allerdings am Delphi-Quellcode interresiert sein solltes, der 100% von mir stammt sag bescheid 


Grüße aus Solingen 

Chris

PS: Zur Zeit: Ja, da hast du schon Recht! Die Zeit ist sehr wichtig bei der Physik. Aber letzendes ergibt sich die teils aus edr Differenz der vorher und nachgemessenen Zeiten. (Rendern...)


----------



## Siassei (11. Jun 2008)

Servus Chris,

deine Antwortzeiten sind wirklich beeindruckend   



> Ich kann sie da irgendwo verstehen, und es macht doch merh spaß es zu erstehen und zu lernen als es gesagt zu bekommen, bzw die Lösung!


Dickes Lob  :applaus: 



> "perfekter"


Nobody is perfect  :wink: Versuchen darf es jeder mal   Ich wünsche dir noch viel Glück und melde dich einfach mal wieder.


----------



## Kr0e (11. Jun 2008)

Danke! Werde ich !

Gruß Chris


----------

