Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.09.2010, 03:11

Netwerksynchronisierung: Character movement

Hallo!

Ich bin neu hier bei spieleprogrammierer.de und habe auch gleich ein paar Fragen mitgebracht :)

Derzeit entwickle ich ein Tilebasiertes 2D Game (kann man eigentlich noch kein Game nennen),dass ich nun netzwerkfähig machen will.
Leider habe ich mit Netzwerkprogrammierung in der Praxis noch nicht sehr viel Erfahrung und bin eigentlich nur mit wenigen Herangehensweisen vertraut.

Nun meine Frage ist folgende:
Wie kann ich bei der Bewegung von mehreren Charakteren auf meiner Tilemap alle Clients synchron halten? Bei einem Server/Client Modell dauert es ja eine Weile bis der Charakter, der sich bewegen will ein Request an der Server sendet, dieser das Packet verarbeitet, und an die anderen Clients weiterschickt. Wie kann ich genau diese Zeitspanne ruckelfrei bei alle Clients "umgehen"?

Weiters Frage ich mich ob ich (weil eben Tilebasiert) absolute koordinaten verschicken sollte. Vektoren hätten ja eigentlich wenig Sinn oder?

Ich würde mich über ein paar Antworten sehr freuen

2

20.09.2010, 09:50

Du kannst dir mal diese Tutorial Reihe anschauen:
http://playerio.com/documentation/tutori…torial/realtime
http://playerio.com/documentation/tutori…synchronization
http://playerio.com/documentation/tutori…l/interpolation
http://playerio.com/documentation/tutori…utorial/latency
http://playerio.com/documentation/tutori…rial/tipstricks
erklärt die allg. Konzepte (nur der Quellcode und einige Hinweise sind für AS3, was aber eigentlich überhaupt nichts macht)...

Ich würde wie in den Tutorials vorgeschlagen eine Mischung aus state und event synchronisierung wählen. Interpolieren wirst du wohl in allen Fällen müssen, zumindest wenn das ganze realtime action werden soll und die Spielgeschwindigkeit nicht von Latenz und Framerate der Clients abhängig sein soll (in diesem Fall könntest du das Spiel sonst als rundenbasiert sehen).

Die Frage mit den Vektoren oder absoluten Koordinaten verstehe ich nicht so richtig.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

20.09.2010, 10:11

Bewegung über Vektoren ist ein inkrementelles Modell. Inkrementelle Modelle sind immer numerisch instabil, führen also irgendwann meist zu total abstrusen Positionen bei den Clients und sollten daher vermieden werden. Ziel-Koordinaten einer Bewegung sollten daher absolut sein und man sollte ebenfalls über Start-Koordinaten nachdenken um eine weitere Synchronisierung erzielen zu können.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

4

20.09.2010, 18:13

Zitat

Oh ja, sehr gutes Tutorial. Kommt direkt mal in meine Favourites.
Dem ist eigentlich nichts mehr hinzuzufügen.
In der englischen Fachsprache heißt es teilweise auch "Dead Reckoning " statt Interpolation.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

20.09.2010, 22:45

Zitat

A disadvantage of dead reckoning is that since new positions are calculated solely from previous positions, the errors of the process are cumulative, so the error in the position fix grows with time.

Inkrementelle Modelle sind ungünstig, sagte ich ja schon ;)
Koppelnavigation ist auch kein alternatives Wort für "Interpolation" - deine Antwort klingt nämlich so, als ob du das so aufgefasst hast.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

6

21.09.2010, 16:42

Zitat

Inkrementelle Modelle sind ungünstig, sagte ich ja schon ;)
Koppelnavigation ist auch kein alternatives Wort für "Interpolation" - deine Antwort klingt nämlich so, als ob du das so aufgefasst hast.
Die inkrementellen Fehler treten aber nur bei falschen Realisierungen auf und auch nur in folgenden Fällen:
1. Server und Client verwenden ein unterschiedliches Zeitmaß.
2. Der Server führt die Koppelnavigation nicht lokal aus, um die aktuelle Position mit der Koppelposition zu vergleichen. Sprich (Pseudocode)

C-/C++-Quelltext

1
2
3
4
5
KoppelPosition = calcClientPosition();
if (Position - KoppelPosition > delta_error )
  SendPosition();
else
  SendKoppelPosition();


Um genau zu sein ist Koppelnavigation schon eher Extrapolation, während Interpolation immer zeitlich hinterher hinkt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

21.09.2010, 18:13

Nein, die inkrementellen Fehler treten immer dann auf, wenn die Server- und Client-Hardware nicht identisch sind und verschieden runden, bzw. mit unterschiedlicher Genauigkeit rechnen.

Ich sehe auch keinen Grund, warum man relative Angaben an den Client schicken sollte anstatt absolute. Welchen Sinn soll das haben außer die Synchronisation leiden zu lassen? Wo soll der Vorteil von "SendKoppelPosition" gegenüber "SendPosition" liegen? Da sehe ich weder weniger Traffic, noch weniger Logik dahinter.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

8

21.09.2010, 18:49

Zitat

Ich sehe auch keinen Grund, warum man relative Angaben an den Client schicken sollte anstatt absolute. Welchen Sinn soll das haben außer die Synchronisation leiden zu lassen? Wo soll der Vorteil von "SendKoppelPosition" gegenüber "SendPosition" liegen? Da sehe ich weder weniger Traffic, noch weniger Logik dahinter.
Es war nur Pseudocode ...
Im Endeffekt läßt sich durch entsprechend übertragene Geschwindigkeitsvektoren (Δs) der Traffic auf weniger als 10% drücken,
gegenüber stumpfen Versenden der Position in jedem Tick, bei gleichbleibender Genauigkeit.
Der Logik-Aufwand steigt da natürlich an. Die Daten müssen natürlich auch beim Sender zur Verfügung stehen.
Die Extrapolationsgenauigkeit läßt sich weiter erhöhen, wenn man auch Kenntnis über die Beschleunigung (Δv) hat.
Solange die Genauigkeit beim Client ausreicht, wird überhaupt kein Update versandt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

21.09.2010, 20:27

Auf 10%? Wie soll das gehen? Ein Vektor hat so weit ich das sehe vermutlich die typischen 3 Komponenten, jede vermutlich 4 Byte groß. Das haben absolute Angaben vermutlich ebenfalls. Wo sind das 10%?
Zudem ist es absolut nicht notwendig in jedem Tick gewisse Angaben zu senden, sondern lediglich bei jedem Start oder Ende einer Bewegung mit deren jeweiligen Richtung (eventuell sogar noch die Zeitpunkte und den korrekten, serverseitigen Startpunkt). Ob ich da absolute Angaben mache oder relative zum letzten Update, das spielt überhaupt keine Rolle, nur sind letztere auf Dauer ungenau und führen zu nicht vorhersagbaren Offset-Fehlern). Auch braucht der Client (fast) keine Positions-Angaben an den Server schicken, da der Client ohnehin nur das anzeigt, was der Server befiehlt und aus den Start- und End-Punkten einer Bewegung die Positionen dazwischen selber extrapolieren/interpolieren kann.
Das hat bei unserem MMORPG-Server mit mehr als 1000 Spielern in einem Siege super funktioniert und ich sehe da auch keinen Weg, wie man das auf 10% hätte reduzieren wollen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

21.09.2010, 22:08

@BlueCobold: Falk hat genau das gesagt was du da geschrieben hast ;) Und der Server muss auch die Client-Position gesendet bekommen --> Cheaten, weil wenn sich der Char auf einmal 5000m weiter vorne befindet, kann da was nicht stimmen ;)

Werbeanzeige