Serverseitige MMORPG-Java-Architektur

8

Ich mache gerade ein MMORPG-Spiel, das rundenbasiert ist. Der Client soll auf Android laufen. Jetzt macht mein Freund die Grafik und ich habe die Spielklassen (Spieler, Waffen usw.) gemacht. Wenn der Kampf gestartet wird, können die Klassen durch Schnittstellen manipuliert werden (für meinen Partner ist es so, als würde er mit reinen Schnittstellen arbeiten, er benötigt keinen Zugriff auf die Implementierungsklassen).

Jetzt müssen wir einen Spieleserver einführen, um mehrere Spieler zuzulassen. Und einige sehr wichtige Fragen stellen sich:

1) Soll ich das Spielmodell vollständig auf den Server kopieren und keine Klassen auf dem Client belassen, oder ist es besser, 2 Kopien des Modells zu haben - 1 auf dem Server und 1 auf dem Gerät, und die regelmäßige Synchronisation zwischen diesen abzuschließen?

2) Welche Verbindungsmethode soll zwischen dem Client und dem Server gewählt werden (Client in Sichtweite ist Android Phone)? Was den Server betrifft - ich wende mich Java zu, weil ich einige Erfahrungen damit habe. Aber jetzt lautet die Frage: Ist es besser, Sockets für diese Aufgabe zu verwenden, oder kann ich REST-Services verwenden, oder es ist sogar möglich, sie irgendwie mit einem Java EE-Server zu verbinden, was aus meiner Sicht cool ist, da dadurch viel Programmieraufwand entfällt Komplikation? Obwohl das Spiel im Mehrspielermodus gespielt wird, ist es rundenbasiert, sodass es nicht sehr oft erneuert werden muss.

3) Was ist mit Einfädeln? Sollte jeder Kunde seinen eigenen Thread haben (bei Sockets)?

4) Gibt es Bücher über die Programmierung von REAL MMORPG-Serverspielen?

Artem Moskalev
quelle

Antworten:

7

Kopieren Sie nicht das gesamte Spielmodell auf den Server, Sie möchten nicht alle Texturen und detaillierten Netze auf Ihren Server laden. Halten Sie es so einfach wie möglich, erledigen Sie alle wichtigen Prozesse wie Standort, Gesundheit und Bewegung, aber laden Sie nicht alles. - VERTRAUEN SIE NIEMALS DEM KUNDEN.

Es gibt viele Bücher und mehrere Wikis. Jeder Motorenhersteller wie IdeaFrabrik, Epic Games, Exitgames, Unity (unterstützt auch MMOs) hat eine sehr gute Dokumentation für seine Produkte. Das meiste davon ist öffentlich, so dass Sie Zugriff auf Komplettlösungen haben und tatsächlich herausfinden können, wie das Zeug funktioniert.

Der einfachste Weg, ein Buch zu finden, das Sie benötigen, besteht darin, Amazon nach MMORPG zu durchsuchen, dann zur Buchkategorie zu wechseln und die Unterkategorie "Programmierung" auszuwählen. Wenn Sie es googeln, erhalten Sie unerwünschte Ergebnisse ...

Hier ist die Liste der Bücher, die ich gefunden habe

Ich habe mich nicht eingehend mit Serverprogrammierung befasst, aber tatsächlich war ich kurz davor, die Unity + Photon Cloud Engine-Lösung für mein MMORPG-Projekt auszuwählen. (HeroEngine hat gewonnen) Die Serverseite wird in C # erstellt, und eine Sache, an die ich mich noch gut erinnere, ist die Art und Weise, wie die Dinge in den Tutorials erklärt wurden.

Mikolaj Marcisz
quelle
Wir verwenden keine Engine, da für das Spiel keine erforderlich ist. Es fehlen coole Grafiken. Wir brauchen also keine Einheit mit ihren herausragenden Funktionen für 3D. Die von Ihnen bereitgestellten Bücher scheinen zu umfangreich zu sein - immer noch kein Verweis auf das Buch, in dem erklärt wird, wie ein Multiplayer-Hochlastserver geschrieben wird. Aber danke für den Rat.
Artem Moskalev
Sie müssen etwas über die TCP-Server-Client-Programmierung lernen. "Auf brutale Weise wird die Serverprogrammierung auch in Spielen verwendet". Man muss seine Basis lernen. Dies könnte Ihnen den Einstieg in Java erleichtern. edn.embarcadero.com/article/31995
Mikolaj Marcisz
Ja, das weiß ich bereits =) Ich habe genug davon in Verbindung mit JMS und einfachen String-Message-Servern programmiert =) Deshalb habe ich gefragt, welche besser sind + Sockets sind im Vergleich zu Java EE, mit dem ich zuvor gearbeitet habe, ziemlich niedrig. Ich weiß nur nicht, wie es mit Multiplayer-Spielen gemacht wird, weil es bisher so aussieht, als
ob das
4

1) Soll ich das Spielmodell vollständig auf den Server kopieren und keine Klassen auf dem Client belassen, oder ist es besser, 2 Kopien des Modells zu haben - 1 auf dem Server und 1 auf dem Gerät, und die regelmäßige Synchronisation zwischen diesen abzuschließen?

Mit Mikolaj einverstanden, kopieren Sie nicht alles. Senden Sie so wenig Daten wie möglich. Sie können auf Client und Server dieselben Klassen haben (die nur das Datenmodell darstellen, nicht andere Assets), diese jedoch nicht über das Netz senden. Sie möchten sie auf dem Server serialisieren und auf dem Client deserialisieren. Der Client sollte nur Befehle an den Server senden.

2) Welche Verbindungsmethode soll zwischen dem Client und dem Server gewählt werden (Client in Sichtweite ist Android Phone)? Was den Server betrifft - ich wende mich Java zu, weil ich einige Erfahrungen damit habe. Aber jetzt lautet die Frage: Ist es besser, Sockets für diese Aufgabe zu verwenden, oder kann ich REST-Services verwenden, oder es ist sogar möglich, sie irgendwie mit einem Java EE-Server zu verbinden, was aus meiner Sicht cool ist, da dadurch viel Programmieraufwand entfällt Komplikation? Obwohl das Spiel im Mehrspielermodus gespielt wird, ist es rundenbasiert, sodass es nicht sehr oft erneuert werden muss.

Sie planen ein rundenbasiertes MMORPG (keine Ahnung, wie das funktionieren würde). Geschwindigkeit ist also kein großes Problem. Sie können jede Art von Service nutzen, REST könnte gut sein, es ist einfach. Normalerweise verwenden MMORPGs UDP (nicht sicher, kleiner, schneller) für Dinge wie Bewegungsaktualisierungen, bei denen ein oder zwei verlorene Pakete keine Rolle spielen, und TCP (sicher, Overhead) für die sichere Kommunikation. Die meisten Spiele verwenden wahrscheinlich ein verschlüsseltes, komprimiertes benutzerdefiniertes Protokoll über UDP und TCP, um es schnell und schwer zu knacken.

3) Was ist mit Einfädeln? Sollte jeder Kunde seinen eigenen Thread haben (bei Sockets)?

Normalerweise möchten Sie einen Thread-Pool haben. Jeder Thread aus dem Pool bedient eine Anforderung und wird dann recycelt. Wenn Sie nicht genügend Threads haben, können Sie in Betracht ziehen, weitere Threads zu blockieren oder zuzuweisen.

4) Gibt es Bücher über die Programmierung von REAL MMORPG-Serverspielen?

Mikolaj hat das schon für dich gegoogelt ...

MartinTeeVarga
quelle
Könnten Sie den Thread-Pool näher erläutern? Wenn Sockets vorhanden sind, überwacht der Server Anforderungen und weist jedem einen neuen Socket zu. Diese Sockets mit allen eingehenden Informationen können als Job für den Thread gekapselt werden. Aber wie werden Threads aus dem Thread-Pool abgerufen, wenn diese Threads jedes Mal unterschiedliche Jobs haben? + Wie viele offene Sockets können einen durchschnittlichen Server aufnehmen? Wird es ressourcenintensiver als REST sein oder nicht? + In REST gibt es keinen Sitzungsstatus, daher ist es schwierig, die Spielerinformationen zu pflegen. Aber Rest in Java hat eine perfekte Integration in Enterprise Server, was gut ist
Artem Moskalev
In den vorgestellten Büchern dreht sich alles um das OOP-Design von MMORPG, wie aus den Kommentaren hervorgeht. Dafür bleib lieber bei GoF. Wieder scheint es, als sei die serverseitige Multiplayer-Online-Spielprogrammierung eine Art heiliges Wissen, das durch die Generation weitergegeben wird =) Alle Foren / Beiträge / Bücher kommen zu den folgenden Ideen: "Versuchen Sie nicht, MMO zu programmieren / MMO zu programmieren ist wirklich schwer / MMO ist nichts für ein Neuling "... und überhaupt kein Rat ...
Artem Moskalev
1
Schauen Sie sich dieses Beispiel an: tutorials.jenkov.com/java-multithreaded-servers/…
MartinTeeVarga
In den vorgestellten Büchern dreht sich alles um das OOP-Design von MMORPG, wie aus den Kommentaren hervorgeht. Dafür bleib lieber bei GoF. Dieser Satz macht keinen Sinn. Auch der Bau eines MMORPG entspricht dem Bau eines Düsenflugzeugs. Ich würde sagen, verdienen Sie Ihre Flügel mit Papierflugzeugen.
MartinTeeVarga
Sie haben zu 100% Recht mit Papierflugzeugen =) Aber in diesen Büchern geht es nicht einmal um Papierflugzeuge (mit Papierflugzeugen meine ich die serverseitige mmo-Programmierung) - das habe ich bereits aus den Kommentaren zu amazon gelernt =) Einige dieser Bücher befassen sich damit Entwurfsmuster für MMORPG-Spiele, die aus anderen, besseren Büchern im selben Kontext wie beim Erstellen von Spielen gelernt werden können. + Ich baue bereits eine B-2, daher freue ich mich über jeden Rat, den ich bekommen kann. Danke =)
Artem Moskalev