Zusätzlich zu dem Artikel, der in anderen Antworten verlinkt ist, kann ich etwas über die Erfahrungen mit dem Arianne-Projekt erzählen .
Wie halte ich die Dinge synchron?
Wir haben das Framework „ Marauroa “ um das Konzept der Handlungen und Wahrnehmungen herum aufgebaut: Handlungen werden vom Client an den Server gesendet und tragen Benutzereingaben wie (gehe nach links, greife Monster # 47 an, sag 'Hallo'). Und vom Server werden Wahrnehmungen an die Clients gesendet, die ihnen den Zustand der Welt nahebringen. Diese Wahrnehmungen werden jede Runde gesendet. Je nach Spiel verwenden wir Rundenzeiten von 30ms bis 300ms.
Wir haben zwei Arten von Wahrnehmungen : Eine vollständige Wahrnehmung wird beim Anmelden gesendet und wenn der Spieler einen neuen Bereich (Zone) betritt. Danach werden unterschiedliche Wahrnehmungen gesendet, die nur die geänderten Attribute (z. B. Position) der geänderten Objekte und natürlich neue und entfernte Objekte enthalten.
Wie kann man Latenzprobleme umgehen?
Wir sind fest davon überzeugt, dass der Server immer richtig ist. Der Klient macht einige Vorhersagen wie reibungsloses Gehen, Kollisionsprüfungen und so weiter. Aber wenn ein Client und der Server sich nicht einig sind, gewinnt der Server. Das Teilprojekt Stendhal (ein 2D-RPG) verwendet standardmäßig eine Umdrehungszeit von 300 ms (mit viel Glättung auf Client-Seite). Dies macht Stendhal sehr widerstandsfähig gegen Verzögerungen.
Hinweis: Einige andere Spiele vertrauen dem Client in gewissem Umfang, um die Auswirkungen von Netzwerkverzögerungen zu minimieren. In WoW wurde es oft auf einem Schlachtfeld namens "Warsong Gulch" ausgenutzt. Es gibt zwei Möglichkeiten, die ein Spieler mit der Flagge wählen kann: In der Mitte durch einen Tunnel und auf der rechten Seite den Berg hinauf. Ein betrügerischer Spieler rennt in Richtung Tunnel und verursacht dann für sich selbst eine Verzögerung. Der Server und die anderen Clients sehen ihn weiterhin auf sich zu rennen. Aber nach einiger Zeit kann dieser Client dem Server mitteilen, dass er in Richtung des Hügels gegangen ist. WoW prüft, ob der Abstand zwischen den zuletzt übertragenen und den aktuellen Koordinaten zum Zeitsegment passt und akzeptiert dies.
Verwendung von UDP vs. TCP
In früheren Versionen haben wir UDP verwendet, um den Overhead von TCP zu reduzieren. Verlorene Pakete haben wir selbst gehandhabt. Dies hat zu Beginn des Projekts perfekt funktioniert. Aber als der Server vor einigen Jahren von einer DSL-Heimverbindung in ein richtiges Rechenzentrum verlegt wurde, gab es große Probleme. UDP ist (oder war vor mindestens 5 Jahren) extrem anspruchsvoll in Bezug auf die CPU-Leistung von Firewall-Hardware: Der Regelsatz muss auf jedes einzelne UDP-Paket angewendet werden. Für TCP wird der Regelsatz jedoch nur für die ersten 3 Pakete angewendet. Danach ist die Verbindung hergestellt. Alle folgenden Pakete umgehen den normalen Regelsatz, weil sie sich in der Verbindungstabelle befinden oder weil sie kein SYN-Flag haben.
Wie schützt man die Kommunikation und den Client vor Reverse Engineering?
Arianne ist komplett Open Source, dazu gehören Client, Server, Grafik, Musik. Dazu gehören natürlich auch unsere Protokolldokumentation und sogar ein Analysator, der zum Debuggen verwendet wird.
Es ist einfach, die Kommunikation mithilfe von SSL gegen unbefugtes Abhören durch Dritte zu schützen.
Ein Schutz gegen Reverse Engineering ist jedoch nicht möglich. Sicher können Sie es verschleiern und Anti-Debugging-Techniken verwenden. Letztendlich können Sie jedoch ein Reverse Engineering von Software, die Sie an Benutzer weitergeben, nicht verhindern. Es gibt eine sehr interessante Präsentation darüber, wie Skype rückgängig gemacht wurde, obwohl die Entwickler sich sehr um Anti-Debugging-Techniken bemüht haben: http://recon.cx/en/f/vskype-part1.pdf
Hinweis: In einigen Ländern ist das Reverse Engineering illegal oder es ist zulässig, einen Absatz in die Lizenz aufzunehmen oder das Reverse Engineering zu verbieten. Es gibt jedoch auch andere Länder (wie das Land, in dem ich lebe), die ausdrücklich das Reverse Engineering im Zusammenhang mit der Entwicklung kompatibler Datenspeicherformate oder Übertragungsprotokolle zulassen, Absätze in der Lizenz oder Nutzungsbedingungen, die versuchen, dies zu verbieten, sind ungültig. (Alles in diesem Abschnitt ist, soweit ich weiß, kein Anwalt.)
Welche Dinge sollen lokal berechnet werden und welche Dinge auf dem Server?
Wir berechnen alles, was mit der Spielelogik auf dem Server zusammenhängt. Der Kunde wird bestimmte Ereignisse vorhersagen, damit das Spiel reibungslos läuft. Aber am Ende hat der Server immer Recht.
Vorausgesagte Ereignisse sind beispielsweise das Anhalten der Bewegung, wenn eine Kollision auftritt. Stendhal verwendet ein Raster, um Elemente zu positionieren. Und vom Server aus gesehen befindet sich die linke obere Ecke jeder Entität auf genau einem Quadrat. Der Kunde wird sie jedoch problemlos zwischen den Kacheln hin- und herbewegen. Es wird auch den Pseudo-3D-Effekt zeichnen. Daher kann eine Entität mit einer Basis von 1x1 im Client höher sein.
Wie können Lastprobleme ausgeglichen werden?
Versuchen Sie dies so einfach wie möglich zu halten, um die Wartung zu vereinfachen.
Der Lastenausgleich statischer Inhalte ist im Bereich der HTTP-Servercluster und Inhaltsverteilungsnetzwerke bekannt.
Ein ziemlich einfaches Konzept für den Lastenausgleich von Spieldiensten besteht darin, Server über Regionen / Zonen aufzuteilen. Die Zone AC befindet sich also auf einem Server und die Zonen DF auf einem anderen. Dies ist besonders einfach, wenn Sie nicht von Zonen in einem Satz zu Zonen in einem anderen Satz schauen können. Sie müssen dort einige Überprüfungen vornehmen, damit ein Client nur eine Verbindung zu einem Zonenserver herstellen kann, der für die Zone zuständig ist, in der sich der Player befindet.
Die einfachste Möglichkeit, Spieler von einem Server auf den anderen zu übertragen, besteht darin, sie in die Datenbank zu schreiben, den Client anzuweisen, eine Verbindung zum anderen Zonenserver herzustellen und sie vom aktuellen Server zu trennen. Der Client stellt dann eine Verbindung zum neuen Zonenserver her, der ihn aus der Datenbank lädt. (Da Sie ohnehin das Laden von / Speichern in den Datenbankcode benötigen, kann die direkte Kommunikation zwischen den Servern für die Übergabe später implementiert werden.)
Einige zusätzliche globale Dienste werden benötigt durch: Beim Anmelden müssen die Clients angewiesen werden, sich mit dem richtigen Zonenserver zu verbinden. Und vielleicht möchten Sie ein weltweites Chat-System.
Ich habe dieses Thema ausführlich unter Wie wird in MMOs ein Lastenausgleich erreicht?