Movement "Algorithmus" in Client-Server-Multiplayer (MMO) Games?

8

Ich habe ein 2D-Flash-Multiplayer-Spiel und einen Socket-Server geschrieben. Mein ursprünglicher Plan für den Bewegungsalgorithmus zwischen dem Client und dem Server war der folgende:

  • Der Client informiert den Server über den Bewegungsmodus des Spielers (vorwärts oder rückwärts) und den Abbiegemodus des Spielers (nicht drehen, links oder rechts abbiegen), wenn sich diese ändern.
    • Der Server wiederholt alle paar Millisekunden alle Spieler und berechnet den Winkel und die zurückgelegte Entfernung, basierend auf dem Zeitunterschied. Die gleiche Berechnung wird vom Kunden durchgeführt.

Meine aktuelle Berechnung für den Client (gleiche Mathematik wird im Server verwendet) == & gt;

Drehen

%Vor%

Bewegung

%Vor%

Das scheint großartig zu funktionieren. Um Verzögerungen zu berücksichtigen, korrigiert der Server die Daten des Clients hin und wieder, indem er diese Daten sendet.

Bei diesem System wird nur sehr wenig Bandbreite für die Bewegung benötigt. Allerdings sind die Unterschiede zwischen meinem Server und den Koordinaten und Winkeln des Kunden zu groß. Sollte ich vielleicht meinen "Algorithmus" erweitern, um auch die Latenzzeit eines Benutzers zu berücksichtigen? Oder gibt es bessere Möglichkeiten, die Bewegung in Client Server Multiplayer-Spielen mit großer Leistung zu handhaben?

    
Tom 30.06.2009, 20:06
quelle

3 Antworten

6

Mein anfängliches Design wäre ähnlich wie Ihres, aber wenn das nicht funktioniert, könnten Sie vielleicht dem Client erlauben, ALLE Bewegungen auszuführen und den Server nur eine Bereichsüberprüfung durchführen lassen.

Wenn also Ihre letzte gemeldete Position X war, muss die nächste innerhalb eines Radius von X liegen, wobei der Radius auf der Differenz der Zeitstempel basiert, die vom Client mit den x, y Daten gesendet werden.

Meistens wird dies nur benötigt, um Betrug zu erkennen.

Beim Stoppen, Kämpfen usw. muss eine Position zusammen mit dem Angriff gesendet werden, und Aktionen, die von Positionen ausgelöst werden, werden nur ausgelöst, nachdem der Client das Update für diese Position gesendet hat, aber serverbasiert ist.

Nicht sicher, dass dies zu viel helfen würde, aber es könnte die erschütternden resyncs stoppen, die Sie von Ihrem ursprünglichen Algorithmus sehen würden.

Kommentarantwort:

Nein, die Clients würden den Server immer noch über ihre Position informieren, aber der Server würde nicht versuchen, die nächste Position zu berechnen. Dies würde bedeuten, dass der Server (und alle anderen Clients) mindestens einen Sende- / Empfangszyklus in Position hätte.

Ich schätze, ich sage nur, dass der Client die ganze Arbeit erledigt, herauszufinden, wo der Charakter ist und dem Server sagt, aber genug Informationen, dass der Server optional die Gültigkeit prüfen kann, um sicherzustellen, dass niemand betrügt.

Die Cheat-Erkennung könnte sogar ausgeschaltet werden, um die Leistung zu überprüfen, oder um sie nach dem Zufallsprinzip zu überprüfen.

Hinweis: Alle Kollisions- / Positionsinformationen für Objekte innerhalb des Reisebereichs müssen an den Client gesendet werden, damit dies funktioniert.

    
Bill K 30.06.2009, 20:14
quelle
1

Es gibt zwei Möglichkeiten, wie ich das machen kann: Lassen Sie den Client Befehle an den Server ausgeben. Der Server wird der ultimative Kartenhalter sein.

Oder behalten Sie die Karten in den Clients, & amp; Die Clients müssen Verbindungen zu anderen Clients herstellen, die sich in der Nähe befinden, um Bewegungen auszuführen, wobei die Aufzeichnung vom Server durchgeführt wird. überprüft von ein paar Kollegen (Hacker-Polizei).

Interessant für mich ist die Möglichkeit, Peer-Verbindungen zu überwachen, und Peers, die eine Latenz über einer bestimmten Schwelle haben, werden einfach nicht im Spiel erscheinen.

    
ryansstack 30.06.2009 23:51
quelle
0

Ist Ihr Server so langsam, dass er nicht alle Bewegungen bewältigen kann? Vor allem in einem 2-D-Spiel? In der Regel gibt mir der Server alle meine Bewegungen zurück, wenn ich kleine 2D-Spiele mache, so dass keine Berechnung auf dem Client erforderlich ist. Wenn der Server zu verzögern beginnt, fange ich einfach ein wenig ein, was man normalerweise sowieso erwartet (obwohl das fast nie passiert).

In jedem Fall würde ich auf jeden Fall sehen, wie die Leistung ist, ohne dass der Kunde selbst Berechnungen durchführt. Wenn die Leistung nicht gut genug ist, sehen Sie, ob das Durchlaufen von Spielerbewegungen auf dem Server die Verzögerung verursacht (und einen anderen Thread für jeden Client verwenden).

Wenn es tatsächlich eine echte Einschränkung in der Bandbreite gibt (Bewegungen selbst passieren sehr wenig Daten), dann müssen Sie sicherlich die durchschnittliche Verzögerung dieses bestimmten Benutzers finden und diese in den Algorithmus einrechnen. Um jedoch ständig den Durchschnitt zu finden (für Präzision), müssen Sie weiterhin den Server anpingen, um die Umlaufzeit zu finden, die nicht so teuer sein sollte.

    
AlbertoPL 30.06.2009 20:09
quelle

Tags und Links