MMO auf WebRTC

    Bild

    Jeder Programmierer, der sein eigenes MMORPG schreibt, stößt sehr schnell auf ein häufiges Problem . Der gängigste Weg, ein Netzwerk in Client-Server-Spielen zu organisieren, ist ein Stern, bei dem der zentrale Knoten der Server ist und die Blätter Clients sind.

    Bild

    Eine solche Organisation hat unbestreitbare Vorteile, z. B. die Synchronisierung der Spielzustände der Clients auf dem Server, die einfache Implementierung und die fast festgelegten Verzögerungen für den Benutzer. Wo es Pluspunkte gibt, leben die Minuspunkte normalerweise - dies ist die begrenzte Bandbreite des Servers und ziemlich große Verzögerungen, wenn der Client weit von Ihrem Server entfernt ist. Wie man damit umgeht, ist im Blog 0fps.net ausführlich beschriebenund es ist möglich, diese Probleme recht effektiv zu lösen, während Sie in Ihrem Lieblingsstar bleiben - um mehr Server zu kaufen, aber was ist, wenn Sie ein Student sind, mit begrenzten Finanzen und horizontaler / vertikaler Skalierung, für Sie keine Option?

    Gehen Sie nicht gegen die Erstellung von MMORPG vor

    Wie Sie wissen, hat jeder Witz einen Bruchteil eines Witzes. Wenn Sie nicht über genügend Ressourcen verfügen, um das Game-Dev-Kommando zu unterstützen, oder wenn Sie alleine an einem Spiel arbeiten, ist es besser, Ihre Ziele zu überdenken. Als ich anfing, den Auxilium- Netzwerk-Shooter (daraus KDPV) zu machen, verstand ich, dass ich das Problem der Skalierung irgendwie lösen musste, und die offensichtliche Lösung, die in vielen Netzwerkspielen verwendet wird, war die Einführung von Spielsitzungen oder „Schlachten“ - in diesem Fall ist es sehr Verteile diese Kämpfe einfach auf physische Maschinen und halte die Last, aber dies war kein klassisches MMORPG mehr mit offener Welt. Es folgten drei Fehler, nach denen die Entwicklung des Spiels gestoppt wurde:

    Der erste Fehler war zu glauben, dass gute Server für die vernünftige Menge (für mich) gefunden werden können. Erste Messungen der Leistung des Spiels auf Node.JS zeigten, dass ein Prozess das Spiel für 20-25 Personen ausdehnt. Danach beginnt das Absinken der Ereignisschleife und der schwerwiegenden Verzögerungen aufgrund der Verzögerung bei der Berechnung der Physik auf dem Server. Seit für 350 p. pro monat habe ich einen vps mit 250 mb speicher gefunden, dann konnten mehr als zwei prozesse mit dem spiel nicht gestartet werden (beim start dauerte der prozess ~ 100 mb, ja man konnte die muttern festziehen und schrumpfen). Und das 50 Spieler. Nicht wirklich, dass Massive es getan hätte.

    Der zweite Fehler war, das Spiel nicht alleine zu entwickeln, sondern mit der Mannschaft (neun Frauen können pro Monat ein Kind zur Welt bringen, oder?). Es gibt einen guten Artikel darüber, wie man ein MMORPG erstellt"Wir drei haben angefangen, aber am Ende des ersten Entwicklungsjahres war ich allein." Und so geschah es.

    Nun, der dritte Fehler war zu glauben, dass man mit TCP umgehen kann. Wir haben WebSockets als Basis genommen und eine binäre JSON-Komprimierung hinzugefügt, in der Hoffnung, dass dies ausreicht. Wie viele Leute wissen, ist TCP ein Protokoll mit garantierter Zustellung von Paketen in der Reihenfolge, in der sie gesendet wurden. Wenn also ein Paket verloren geht, friert das Spiel für den Spieler eine Weile ein, bis dieses Paket weitergeleitet wird. Am schlimmsten ist, dass danach alle Pakete, die sich in der Warteschlange dahinter befanden, gescrollt werden. Auch hier können Sie Verzögerungen einsparen (künstlich hinzufügen), aber das Hinzufügen von Schmuckkrücken für Krücken (mit TCP anstelle von UPD) ist ein sicheres Zeichen für den falschen Weg.

    Was sie wollten und was fast passierte (von links nach rechts):

    Bild

    Aber genug von der Vergangenheit - was hat sich geändert und wohin wurden die Rechen transferiert, auf die Sie noch einmal treten möchten?

    WebRTC und STCP

    Nachdem ich meine Fehler als Entwickler überlegt hatte, entschied ich mich erneut, das Gebiet der Technologien zu durchforsten, mit denen sich MMORPGs im Browser erstellen lassen. Es ist mir immer noch wichtig, in den Browsern zu bleiben, da dies das Ausführen von Experimenten ohne Installation sehr einfach macht (zumal Unreal Engine 4 sich bereits darauf vorbereitet, in einer Browser-Form zu beenden ).

    Wie sich herausstellte, stand die Welt während der Entwicklung nicht still und WebRTC wurde zu einem neuen, heißen Thema - alle begannen, Skype- und Chatroulette-Killer zu entwickeln, aber was wirklich auffiel, waren die unzuverlässigen und ungeordneten Punkte im verwendeten STCP- Protokoll - was bedeutet, dass das Problem drei behoben wurde ! Aber nicht ohne Einschränkungen.

    Damit WebRTC funktioniert, benötigen Sie einen sogenannten Signalserver, der für die erstmalige Verbindung zweier Browser über STCP zuständig ist, indem er Nachrichten von STUN-Servern sendet. Dies geschah, um NAT zu umgehen, und Sie können mehr darüber in den Artikeln „Wie wir den Dienst auf WebRTC ausgeführt haben“ und „WebRTC in der realen Welt: STUN, TURN und Signalisierung“ lesen . Aus dem letzten Artikel für mich selbst habe ich gelernt, dass Sie in der Hölle sind, wenn Sie WebRTC-Service für Geld anbieten (Sie müssen 100% Arbeit aus allen Netzwerken erreichen). Es ist gut, dass dies nicht unser Fall ist.

    Jetzt kann die Architektur unseres Client-Server-Spiels so aussehen:

    Bild

    Wie Sie sehen, wird die gesamte Interaktion vom Server auf die Clients verlagert. Dieser Ansatz ist verlockend, führt jedoch zu nicht ganz einfachen Aufgaben:
    1. Ist es optimal, einen vollständig verbundenen Graphen zu verwenden?
    2. So synchronisieren Sie den Status des Spiels für das gesamte Netzwerk
    3. Was tun mit unehrlichen Spielern?

    Wenn die Antwort auf die letzten beiden Fragen zum Teil vom Spielmodell abhängt, das Sie entwickeln, kann die erste Frage im allgemeinen Fall beantwortet werden. Dennoch ist es interessant, über HunterCoin zu lesen - ein Projekt, das das Analogon von Bitcoins verwendet, um das Spiel zu synchronisieren, obwohl dies nicht für dynamische Modelle geeignet ist und eine vollständige Synchronisierung aller Transaktionen erfordert (wenn ich richtig verstehe, wie Bitcoins funktionieren). Den Rest der Diskussion über diese Punkte werde ich für den nächsten Artikel belassen.

    Um die Hypothese über das vollständige Diagramm (sowie den Stresstest des Servers) zu testen, benötigen wir ein kleines Demospiel, mit dem die Latenz zwischen Clients gemessen werden kann. Wenn sich herausstellt, dass direkte Verbindungen immer schneller sind als das Senden einer Nachricht über einen anderen Client - dann eine vollständige Grafik, also eine vollständige Grafik (was ich bezweifle).

    MMO - Maus Multiplayer Online

    Demo : mmo.jit.su (Das Experiment ist beendet, das Ergebnis steht am Ende des Artikels.) Vor

    fast einem Jahr gab es weltweit Musikvideos mit Crowd-Sourcing. Wenn Sie es verpasst haben, ist es Zeit zu unterbrechen und zu sehen (und da ist etwas dran). Die Idee ist einfach: Wir zeichnen die Cursorbewegungen während des Videos auf und addieren sie zu den bereits akkumulierten. Als Ergebnis erhalten wir eine sehr unterhaltsame Videosequenz von Cursorn (am Anfang schien es mir, dass die Synchronisation in Echtzeit stattfindet, aber nicht). Nachdem ich mir diesen Clip noch einmal angesehen habe - ich hatte eine Idee für ein Demo-Spiel - werden wir die Cursor bewegen.

    Für die Implementierung benötigen wir etwas, um die Arbeit mit dem Signalserver und das Herstellen von Verbindungen zwischen Clients zu erleichtern. Eine gute Option ist Peer.js- der einen vorgefertigten Signalserver bereitstellt (obwohl er auf restify basiert ) und sogar einen öffentlichen Signalserver hostet.

    Der gesamte clientseitige Code passt in 100 Zeilen JavaScript, der serverseitige Code in Node.JS und noch weniger - 55. Ich sehe keinen Sinn darin, sie in den Artikel aufzunehmen, da sie gemeinfrei und recht einfach zu schreiben sind. Der Code selbst ist unter der MIT-Lizenz erhältlich und ich hoffe, er hilft Anfängern dabei, ihr zerbrechliches Spielzeug herzustellen.

    Was ist das ergebnis

    Nachdem ich einige Statistiken aus dem Spiel gesammelt habe, verspreche ich , die Antwort auf meine Frage darzulegen. Obwohl die Intuition besagt, dass wir uns auf eine konventionelle Netzwerkinfrastruktur stützen, die den optimalen Pfad für das Senden von Paketen auswählen möchte, kann sich herausstellen, dass dieser Pfad eher mit dem Senden von Nachrichten zwischen Spieleclients zusammenfällt als mit dem Herstellen einer neuen Verbindung (und je größer das Netzwerk, desto größer ist die Wahrscheinlichkeit) mehr Gewissheit darüber). Aus diesem Grund werden bei der Übertragung Pakete dupliziert, Statistiken werden jedoch angezeigt.

    Ergebnis

    Bild

    Anscheinend ist etwas schief gelaufen. Wir haben viele Peer-to-Peer-Spieler (links unten) sowie viele verbundene Komponenten mit einer großen Anzahl von Teilnehmern. Die größte Komponente befindet sich unten rechts und ist offensichtlich kein vollständiges Diagramm.

    Warum ist das passiert? Die Implementierung der Verteilung von Bezeichnern in Peer.js kann seltsam sein, da dort Math.random verwendet wird - obwohl dies für 2300 Knoten unwahrscheinlich ist . Höchstwahrscheinlich sind dies die Merkmale des WebRTC-Protokolls - es ist klar, dass Sie sich nicht unendlich viele Verbindungen leisten können .

    Während des Experiments wurde bemerkt (vielleicht nur für mich), dass sich 5-10 Cursor gleichzeitig bewegten, was die Möglichkeit einschränkt, das vollständige Diagramm zum Synchronisieren eines großen Netzwerks zu verwenden. Wie dies nicht durch Rundfunk geschehen kann - dies ist Material für einen separaten Artikel (wenn nicht eine Serie von Artikeln). Vielen Dank für die Teilnahme!

    Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte komm rein .

    Ist es möglich, ein dezentrales MMORPG zu erstellen?

    • 25,7% Kann einen WoW 160- Klon erstellen
    • 44,9% Möglich, aber mit erheblichen Einschränkungen 279
    • 29.3% Es ist unmöglich - es wird nicht möglich sein, es zu spielen 182

    Jetzt auch beliebt: