Sie möchten keine Spielereingaben an den Server senden. Was Sie wahrscheinlich tun möchten, ist, eine abstrahierte Darstellung dessen, was der Player tun möchte, an den Server zu senden und die Logik dort auszuführen.
Ebenso möchten Sie nicht unbedingt alles zurücksenden, was der Kunde tun muss. Sie können beispielsweise eine Nachricht mit dem Titel "NPC X gestorben" senden und der Client legt fest, welche Animation / Sounds abgespielt werden sollen. Solche Sachen.
Der Trick besteht darin, die Linie zu finden, in der Bandbreite und Verarbeitungsleistung (auf dem Server) übertroffen werden, indem verhindert wird, dass Personen betrügen. Normalerweise treffen Sie jede Art von richtungsweisender Entscheidung nur auf dem Server und überlassen das gesamte zusätzliche visuelle Material dem Kunden.
Überall auf der Website gibt es viele spezifischere Fragen zu diesem Thema. Beispielsweise:
Sollte die Kollisionserkennung serverseitig oder kooperativ zwischen Client / Server erfolgen?
Wer berechnet die KI in einem MMO?
Sollte der Spielehost die Autorität oder ein anderer dummer Client sein?
Nun, Sie haben Antworten bekommen, aber Ihre eigentliche Antwort lautet "versuchen Sie es selbst". Die Dinge unterscheiden sich von Spiel zu Spiel.
Ich habe einige Multiplayer-Spiele für einen Kurs über verteiltes Netzwerk-Game-Design gemacht. Die größte Herausforderung bestand darin, ein Echtzeit-Action-Spiel zu erstellen, an dem viele Spieler beteiligt waren und das verdammt gute Beiträge lieferte. In diesem Punkt wird alles zum Problem. Wie Sie den ersten Link sehen, den Tetrat gesendet hat, wird sogar das Ermitteln einer Absprache zum Problem. Und Sie werden Ausdrücke wie Verzögerung, Interpolation, Extrapolation, Vorhersage lesen und hören ... Aber wenn Sie sich nie bemüht haben, von Grund auf neu zu codieren, werden Sie diese Wörter einfach akzeptieren und würden nicht wissen, was sie wirklich bedeuten.
Meine Empfehlung lautet:
Schritt 1
Beginnen Sie vorerst mit dem vollständig autorisierten serverbasierten Design. Wie Sie sagten, senden Sie einfach Benutzereingaben an den Server und lassen Sie den Server alles tun, und die Clients erhalten die Ergebnisse. Ihr Spiel wird vollständig konsistent funktionieren. Aber wenn Sie sich Ihre Kunden ansehen, werden Sie einige Verzögerungen bemerken, einige Teleportationsprobleme, keine reibungslosen Bewegungen ... ect.
Schritt 2
Beheben Sie die Probleme auf der Clientseite. Die Teleportationsprobleme zum Beispiel. Dein Charakter war bei (0,0) und der Server sagte, dass du jetzt bei (100,100) bist. Dein Charakter wird sich einfach nach (100,100) teleportieren, was nicht schön ist. Da kommt die Interpolation. Sie sollten einen Code auf der Client-Seite haben, der das Zeichen reibungslos von (0,0) auf (100, 100) verschiebt. Ja, Sie werden Ihren Charakter von (0,0) auf (100,100) verschieben, aber wie schnell? Im Moment können Sie nur die Zeitdifferenz zwischen den einzelnen Serverupdates verwenden. Wenn Ihr Server 10 Pakete in einer Sekunde sendet, bedeutet dies, dass zwischen jedem Paket eine Verzögerung von 100 ms liegt.
Schritt 3
Jetzt ist Ihr Spiel bereits für schnelle Netzwerke mit einer Verzögerung von (1-50) ms geeignet. Aber es wird zum Scheitern verurteilt, wenn es einen Paketverlust, eine hohe Latenzzeit oder eine Berechnung gibt, die im Server lange dauert ... ect. In diesen Situationen werden Sie bemerken, wenn Sie den Pfeil nach links drücken, dass sich Ihr Charakter mit einer Verzögerung von 200 ms nach links bewegt. Die Verzögerung zwischen Ihrem Paket geht an Server, Berechnungszeit und kommt mit Ihrer letzten Position zu Ihnen zurück. Das ist schlecht, der schlimmste Nachteil des von Servern autorisierten Designs. Der Spieler möchte, dass sein Charakter nach links bewegt wird, sobald er nach links drückt. Sie können ihn nicht warten lassen. Zum Glück hat der Client auch den gleichen Code wie der Server. Warum sollte er nicht sofort auf dem Client ausgeführt und das Endergebnis mit der Antwort vom Server korrigiert werden? Das ist es, was eine grundlegende Eingabevorhersage ist. Der Kunde drückt nach links, der Code in seiner Seite bewegt ihn nach links. nach einiger Zeit, sagen wir mal 200 ms, kommt die reale Position vom Server und der Client korrigiert damit seine Position. Wenn alles in Ordnung ist, merkt der Kunde nichts, "Schritt 2" hilft uns auch dabei.
Nun, net hat viele Tutorials und Dinge zu diesem Thema. Aber es gibt zwei, die ich wirklich mag:
Wirklich gut, deckt dunkle Flecken ab: Valve-Source Engine Multiplayer Networking
Art von Geschichte, lustig zu lesen und es wert: 1500 Bogenschützen am 28.8 .
quelle
Vorteile:
Nachteile:
quelle
Die serverseitige Logik verursacht auch Skalierbarkeitsprobleme - Sie müssen die gesamte Arbeit für alle Clients auf Ihrem Server erledigen - und es jedem Client überlassen, seinen eigenen Anteil an der Gesamtarbeit zu leisten.
quelle
Hängt davon ab, welches Spiel Sie erstellen möchten und welcher Teil des Spiels. Wenn Sie ein RTS (oder ein Spiel mit einem gesperrten Modell) entwickeln, sollten Sie auf jeden Fall nur die Eingabe senden und welchen Simulationsschritt die Eingabe erhalten hat.
Wenn Sie einen Shooter machen möchten, können Sie sowohl Eingabe- als auch Abstraktionsfunktionen verwenden. Wenn Sie sich für Unreal Tournament 3 entscheiden, wurde der Multiplayer hauptsächlich über replizierte Funktionsaufrufe erstellt.
Für die Bewegung nehmen sie die Spielereingabe (komprimiert in ein einzelnes Bit für jede Aktion) Delta-Rotation, Beschleunigung und Zeitstempel und senden sie an den Server.
Für andere Zwecke, wie zum Beispiel Waffen, werden sie beim Schießen synchronisiert (AFAIK, hat sich diesen Teil noch nicht eingehend angesehen).
Bei statischeren / weniger häufig geänderten Werten wie dem Zustand wird die Variable an den Client oder Server gesendet, je nachdem, was der Programmierer angegeben hat.
Denken Sie bei Spielen, die keine RTS-Spiele sind, an die Client-Vorhersage.
quelle