AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [Client/Server]: Timer und Latenz-Kompensation
Thema durchsuchen
Ansicht
Themen-Optionen

[Client/Server]: Timer und Latenz-Kompensation

Ein Thema von blackfin · begonnen am 20. Aug 2010 · letzter Beitrag vom 20. Aug 2010
Antwort Antwort
blackfin
(Gast)

n/a Beiträge
 
#1

[Client/Server]: Timer und Latenz-Kompensation

  Alt 20. Aug 2010, 12:47
Mal wieder eine theoretische Frage von mir, ich brauche keinen Quellcode, sondern nur allgemeine Überlegungen, wie man so etwas praxistauglich mit Delphi-Bordmitteln umsetzen könnte:

Ausgangspunkt:
Ich habe einen Server und einen Client.
Nun kennt ja jeder von Spielen zum Beispiel folgendes:
Der Spieler will einen Zauberspruch casten, dieser braucht eine gewisse "Cast-Zeit", sagen wir mal 1,5 Sekunden.

Wie gehen professionelle Spiele mit so etwas um?
1) Wird der Timer für die Cast-Zeit nur Client-seitig gefeuert? Dann kann man den Client relativ leicht manipulieren.
2) Oder aber: Wird an den Server "Spieler will Zauberspruch x casten" gesendet, der Server erzeugt dann ein Timer-Objekt und feuert ein Event an den Client zurück, sobald die Zeit abgelaufen ist. Dann aber hätte man ein Problem mit der Netzwerk-Paket-Latenz und ggf. auch mit der Server-Auslastung, die man irgendwie kompensieren müsste.
3) Wird der Timer auf beiden Seiten erzeugt und dann vom Server synchronisiert? Auch hier das Latenz- / Auslastungs-Problem, das zu Verzögerungen führen kann. (Client ist mit dem Timer immer früher fertig als der Server)

Das gleiche gilt z.B. auch für Spieler-Bewegungen, die ja auch zwischen den Clients synchronisiert werden müssen.

Ich möchte jetzt diesbezüglich nicht die perfekte Lösung in Hinblick auf Genauigkeit der Timer, sondern Überlegungen und vielleicht sogar Erfahrungswerte, wie so etwas von bereits bestehenden Spielen in der Praxis gemacht wird.

Hat jemand von euch sowas schon einmal gemacht?

Geändert von blackfin (20. Aug 2010 um 12:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Timer und Latenz-Kompesation

  Alt 20. Aug 2010, 12:53
Also bei den Zauber denke ich ist es Nummer 2)

Sicher kann ich dir aber sagen wies bei den Bewegungen abläuft:

Der Spieler drückt z.B: W
nun läuft sein Char local vorwärts, gleichzeitig wird aber mit dem Server-synchronisiert was sich an der Position wo er hinläuft befindet und dies dann zurück an den Client gesendet.
Schön kann man dies sehen wenn du mal Diablo II im Battle.net gespielt hast un dein Char auf einmal wieder 1 km zurückgesetzt wird weil sich durch die Latenz der Server nicht mitbekommen hat das du schon soweit gelaufen bist. Ähnliches bei WoW wo du dann auf einmal im Berg gestanden bist.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

AW: [Client/Server]: Timer und Latenz-Kompensation

  Alt 20. Aug 2010, 12:58
Zitat:
Also bei den Zauber denke ich ist es Nummer 2)
Das heisst, in der üblichen Praxis wird die Latenz einfach ignoriert und der Server hat das sagen?
Oder wird permanent die Latenz ermittelt und über prediction-Algorithmen clientseitig ermittelt, wann der Server wohl fertig sein "könnte" und dann nur noch ab und an synchronisiert wird?
Mir ist bei WoW auch schon aufgefallen, dass Zaubersprüche endlos im "Loop" laufen, wenn mal wieder die Verbindung abgeraucht ist.
(z.B. schiesst der Jäger eine Salve, die nie endet, wenn die Verbindung dann abraucht).
Das würde nach meinem Verständnis bedeuten, dass die Ablaufzeiten allein vom Server abgehandelt werden.
Somit wären aber die reelen Castzeiten nie die tatsächlich geplanten.

Wie gesagt, mir fallen dazu auch mehrere Herangehensweisen ein, aber mich würde interessieren, wie so etwas im "Normalfall" abgehandelt wird.
Nicht, dass ich mir hier nen Wolf programmiere und dann ist das ganze totaler Overkill und macht das Ganze nur noch träge.

Edit:
Stimmt, das mit der Bewegung ist mir auch schon aufgefallen. Ich schätze mal, an den Server wird nur "Taste gedrückt" und "Taste losgelassen" gesendet, zusätzlich zur Bewegungsrichtung, der Server ermittelt die Strecken und diese werden mit dem Client alle paar Sekunden synchronisiert, der ja ebenfalls "live" läuft. Daher kommt dann das "springen" des Charakters bei hoher Server-Last.

Allerdings glaube ich kaum, dass morderne Spiele keine Latenz-Kompensation haben.
Wie würde man so eine Kompensation denn verwirklichen, und das auch noch relativ schnell und ohne grosse Last?

Geändert von blackfin (20. Aug 2010 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#4

AW: [Client/Server]: Timer und Latenz-Kompensation

  Alt 20. Aug 2010, 13:49
Was der Server weiß/wissen muss, hängt sehr stark vom Spiel ab.
Z.B. bei mmorpgs muss der Server ja wissen ob ein Spieler anfängt etwas zu casten, da andere Spieler dies sehen sollen und ihn ggf unterbrechen, usw.
Das jetzt ein Timer auf dem Server erzeugt wird, bezweifle ich. So wie ich es aus mmos kenn ist es so, dass alle Events beim Client berechnet und ausgeführt werden.
ZB sobald ein Spieler anfängt zu casten schickt er PLAYER_START_CAST_SKILL[73] an den Server. Sobald er erfolgreich den Cast ausgeführt hat, schickt er dann PLAYER_END_CAST_SKILL[73] bzw. PLAYER_ABORT_CAST_SKILL[73].
Der Server nimmt dann nur noch die Nachrichten entgegen, loggt+verteilt sie und prüft diese die Befehle zB auf Cheats. (zB damit nicht 100 mal nacheinander PLAYER_END_SKILL kommt ohne PLAYER_STARTS_CAST oder die Castzeit verändert wurde)

Eigentlich ist der Server immer so ausgelegt, dass er möglichst wenig Last hat, aber alles wichtige abfängt.

Achja und zur Latenz:
Da muss man im Spezialfall schaun was genommen wird. Entweder Servertime oder Clienttime. Bei Clienttime wird der Zeitpunkt der Aktion mitgesand.
Z.B.: Client fängt um 20:30:12 an zu casten. Der Befehl kommt um 20:30:13 beim Server an. Jetzt wird vsl die Serverzeit :13 genommen, da es sonst unfair gegenüber anderen Spielern wäre, die ne gute Latenzzeit haben.
Oftmals gibts auch so ein Zwichending, wie mans aus den alten Zeiten aus Guild Wars kennt. Da wird eine Bewegung beim Client gestartet und der Server ermittelt ein Mittelding aus Serverstart/Clientstart und passt dann den Charackter so an das es dem Client nichtmal auffällt, dass er jetzt 3 Pixel versetzt wurde.

Geändert von mleyen (20. Aug 2010 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz