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

28.02.2013, 18:44

Event-basierte Netzwerkkommunikation

Hi,

ich modelliere mir derzeit ein Konzept, um via Netzwerk (Kontext: Server-Client-Anwendung) Events zu behandeln. D.h. ein Spieler erzeugt eine Aktion (z.B. ein Click auf einen Mitspieler). Dann wird entsprechend ein Event erzeugt (hinbewegen, traden, angreifen, chat starten oder sonst etwas). Das Event wird dann an den Server gesendet, so dass er die entsprechenden Daten manipulieren und die Clients über Änderungen informieren kann.
Gehen wir mal vom Beispiel "Spieler will sich bewegen" aus. Dann würde der Client z.B. die Objekt-ID seiner Spielfigur und die Bewegungsrichtung an den Server senden. Der bekommt das (kann noch prüfen ob der Spieler das angegebene Objekt überhaupt bewegen darf und ggf. reagieren) und manipuliert die Daten, d.h. ändert die Position des Spielers.
Gehen wir mal davon aus es gäbe zwei Events: StartMovement und StoppMovement. Dabei würde ab Beginn der Bewegung der Spieler (zyklisch) weiterbewegt, bis die Bewegung gestoppt wird. Welcher Weg ist der "gängige", um die Clients zu informieren?

Variante 1: zyklische Positions-Updates via UDP
Das StartMovement würde ich via TCP senden. Bisher hatte ich überlegt zyklisch via UDP für alle Objekte die Position und Blickrichtung zu senden. Zwar können die UDP Pakete verloren gehen, jedoch wäre das nicht schlimm, da zyklisch aktuellere Daten folgen. Allerdings befürchte ich, dass ich damit zu viel Netzlast erzeuge. Aber ich sehe den Vorteil die Clients zu entlasten, wenn z.B. nicht die Blickrichtung sondern eine Ziel-Position gegeben und ein Pfad zu berechnen ist.

Variante 2: Start-/Stopp-Benachrichtigung der Clients via TCP
Der andere Weg wäre jedem Spieler zu sagen "Objekt X läuft absofort in Richtung Y" (z.B. via TCP, damit es auch alle mitbekommen). Dann würde jeder Client für sich die neuen Positionen berechnen, bis der Server sagt "Objekt X bleibt stehen".

Was ist die gängigere Variante? Ich vermute die zweite :P - bin mir aber nicht sicher - daher die Frage :D

Liebe Grüße
Glocke

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

28.02.2013, 18:46

Über was für eine Art Spiel reden wir denn hier?
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]

3

28.02.2013, 18:48

Ach ja, das hab ich vergessen zu sagen :D
Gehen wir mal von einem Rollenspiel aus (Diablo/Dungeon Siege/Sacred usw.). Bei einem Echtzeitstrategiespiel haben wir ja ganz andere Mengen an Objekten :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

28.02.2013, 18:56

PvP oder PvE basiert? Aber eigentlich egal, die Blickrichtung dürfte weniger kritisch sein, von daher Variante 2. Allerdings würde ich bei "Object X bleibt stehen" auch die finale Position zur Synchronisierung mitsenden.
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]

5

28.02.2013, 19:36

Variante 2. Allerdings würde ich bei "Object X bleibt stehen" auch die finale Position zur Synchronisierung mitsenden.
Wenn ich statt Blickrichtungen Zielpositionen verwende und einen Pfad ermitteln will, ist es aus meiner Sicht sinnvoller die Wegberechnung vom Server machen zu lassen, um am Client Berechnungen zu sparen. Zur Wegfinding sind Kollisionserkennungen imho nicht unerheblich. Ich würde den Server neben den "tatsächlichen" Objektkoordinaten (jeder Client würde ja für sich autonom die Figur "bewegen" aber das nur bei sich, ohne 100%ige Garantie, dass das Objekt auch zur Zeit t am Ort x ist; das weiß der Server mit 100%iger Genauigkeit) auch die Kollisionserkennungen verwalten lassen. Dann ist es aus meiner Sicht dann nur logisch, wenn er auch die Wegfindung erledigt. Entsprechend würde ich alle Wegpunkte an den Client geben; in der Art "Objekt X will nach Position Y und verwendet die Wegpunkte W1,...,Wn". Wäre das vertretbar/sinnvoll?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

28.02.2013, 20:18

Definitiv. Eigentlich versucht man meist so viel wie möglich Berechnungen auf die Clients auslagern. Aber um Cheating zu verhindern, geht das meist nur sehr eingeschränkt. Pathfinding und Kollision muss daher auf dem Server erledigt werden und dann kann man sich das auf den Clients sparen.
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]

7

28.02.2013, 20:58

Okay, danke! Da habe ich jetzt erstmal eine grobe Richtung für mein weiteres Vorgehen :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

01.03.2013, 16:40

Thema Prediction ist hier auch nicht ganz unwichtig. Ich weiß nicht ob du dir darüber schon Gedanken gemacht hast, bzw überhaupt viel damit anfangen kannst. Guck da vielleicht mal ein wenig im Internet. Was auch ganz nützlich ist, ist zu gucken wie andere Engines mit dem ganzen umgehen. Hier gab es im Forum mal einen Thread in dem drei Links genannt wurden. Einer zur Source Engine, in einem gings glaube um Quake und in einem ging es um allgemeine Konzepte. Die drei Links haben mir bei einem Projekt mal sehr gut weitergeholfen. Ich finde sie grad nicht. Ich gucke gleich aber noch mal.

edit: in diesem Beitrag. Fred hat recht weit oben drei Links gepostet. Die fand ich alle drei ziemlich informativ. Aber es war Unreal und nicht Quake;) Naja hilft dir sicher weiter.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (01.03.2013, 16:53)


Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

01.03.2013, 19:16

Meine (persönlichen) Tipps zu dem Thema (gibt nat immer die Ausnahmefälle wo diese Tipps nicht greifen, aber die sind selten):
-(eigentlich) nie TCP und UDP mixen. UDP wird TCP in fast jedem Fall aus dem Konzept bringen und die UDP Verlustrate wird auch nicht unbedingt besser dadurch.
-wenn möglich Zustände statt Nachrichten verwenden. Weil mit 100% Wahrscheinlichkeit geht irgendwann doch irgendwas schief und der berühmt berüchtigte OoS betritt die Bühne. Für ein Nachrichtne basiertes System ist dass äquivalent zum Gameover. Für ein Zustand basiertes ist das höchstens ein "ups" oder fällt garnicht auf.

Außerdem (hast du ja eh vor):
-server-client basiertes System & Server = Gott
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

01.03.2013, 20:12

Ich würde auch das mit den Wegpunkten empfehlen. Der Client hat dann nur noch die Aufgabe den Weg zwischendrinnen zu interpolieren.
Wenn du bei deinem Rollenspiel allerdings eine Pfeiltastensteuerung wie in Egoshootern drinnen hast, ist der Zielpunkt bzw. der Weg nicht vorhersehbar, daher würde ich z.B. jede 20 ms die aktuelle Transformation senden
und den Client halt zwischen den Daten interpolieren lassen. (Ich glaub das machen moderne Egoshooter auch so)

Werbeanzeige