Forum: PC-Programmierung Framerateproblem bei Spieleprogramierung


von Klaus (Gast)


Lesenswert?

Ich habe ein Spiel programmiert, bei dem ich gerade an den Feinheiten 
des Multiplayermodus arbeite. Zunächst war das Spiel so programmiert, 
das die Spielgeschwindigkeit und die Framerate direkt zusammen hingen 
(einfach beides in der Hauptschleife berechnet). Für den 
Multiplayermodus hab ich das ganze nun mal auf ein vernünftiges 
Grundgerüst gestellt, und anhand von Timern und Events läuft die 
eigentliche Spielengine nun unabhängig von den Frames und wird über 
Netzwerknachrichten auf den Clients synchronisiert.

Daraus ergibt sich für mich aber jetzt ein Problem:
Vorher wurden zwischen jedem Frame die Objekte um einen bestimmten Wert 
bewegt. Das erzeugte natürlich eine schöne gleichmäßige Bewegung. Jetzt 
ist es so, das die Bewegungen (denn das ist ja Sinn der Sache) von der 
Framerate unabhängig sind. Das bedeutet aber auch, dass zwischen 2 
Frames unterschiedlich viele Bewegungsschritte ausgeführt werden können. 
Und das sieht dann nach ziemlich ruckeliger Bewegung aus. Wie macht man 
sowas in Spielen korrekter Weise, damit die Bewegungen gut aussehen?

von Vlad T. (vlad_tepesch)


Lesenswert?

V-Sync
kleineres Δt zwischen Updates der Welt
höhere Framerate

von Udo S. (urschmitt)


Lesenswert?

Indem du mit Geschwindigkeiten rechnest.
Du merkst dir die Zeit an dem du den vorherigen Frame angefangen hast zu 
berechnen.
Die von der aktuellen Zeit (Zeit zu Beginn der Berechnung des aktuellen 
Frames) abgezogen ergibt deine Deltazeit
In deinem Bewegungsmodell hast du die Geschwindigkeiten deiner bewegten 
Objekte (oder der Perspektivenänderung) und kannst dein deltaWeg über 
Geschwindigkeit mal deltaT berechnen.

von Vlad T. (vlad_tepesch)


Lesenswert?

das funktioniert bei einem Single-Player-Spiel. Bei Multiplayer nicht.
Hier muss es einen Server geben, der Welt komplett unabhängig von der 
eigenen Anzeige berechnet.

von Klaus (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> Bei Multiplayer nicht.
> Hier muss es einen Server geben, der Welt komplett unabhängig von der
> eigenen Anzeige berechnet.

Jap, genau den gibts bei mir. Ich habe jetzt das delta T auf 10 
Millisekunden verkleinert. Sieht zumindest akzeptabel aus.
Höhere Framerate ist keine Option. An meiner Grafikengine lässt sich 
sicherlich noch einiges optimieren (andere Baustelle, kommt später), 
aber spätestens auf älterer Hardware ist die Framerate wieder so 
niedrig, damit sollte das Spiel schon klar kommen.

Was ich mir jetzt als Lösung überlegt hab: Ich koppel die Framerate 
wieder an die Weltupdates. Aber nicht in einem festen Verhältnis. 
Sondern ich bestimme dynamisch wie viele delta Ts in einen Frame passen 
würden, und nehme dann das nächst größere ganze Zahl. Als Beispiel: Wenn 
ein Frame 2,5 delta T dauern würde, springen die Einheiten mal 2 und mal 
3 Schritte pro Frame weiter. Der gemessene Faktor von 2,5 wird 
aufgerundet auf 3. Das bedeutet dann, dass ich nach jedem dritte 
Weltupdate das Neuzeichnen eines Frames anstoße. Damit habe ich eine 
möglichst hohe Framerate bei gleichzeitig möglichst gleichförmiger 
Bewegung der Fahrzeuge.

Was haltet ihr von der Lösung?

von Vlad T. (vlad_tepesch)


Lesenswert?

hört sich gut an

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.