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?
V-Sync kleineres Δt zwischen Updates der Welt höhere Framerate
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.