Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Jar

Treue Seele

  • »Jar« ist der Autor dieses Themas

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

1

03.01.2017, 13:47

Lobby Server Architektur

Schönen guten Tag,

ich plane gerade ein neues Multiplayer Game, welches Spieler mithilfe eines Lobby-Systems miteinander verbindet.
Nun habe ich mehrere Ansätze...

Meine erste Idee war es einen Server bereit zu stellen, auf dem Clienten eine Lobby erstellen können oder der Lobby beitreten können.
Wenn die Lobby bereit ist, wird bei dem Lobbyersteller(Host) ein Server gestartet und die Clienten der Lobby verbinden sich mit diesem und das Spiel beginnt.

Das Problem bei diesem Ansatz ist, sobald der Host die Verbindung verliert, werden alle anderen Clienten rausgeschmissen. (Bisher existiert kein Retry, oder Halten Mechanismus)
Außerdem ist Teil des Konzepts, dass man nicht durchgehend Aktionen im Spiel machen muss, es kann auch erst am darauf folgenden Tag weiter gespielt werden.

Die zweite Idee beinhaltet auch einen Server mit Lobbys wie oben. Hier ist der Unterschied, dass das Spiel vom Server gehostet wird. Wenn ein Spieler die Verbindung verliert, werden die anderen nicht vom Spiel getrennt. Bei der Planung ist mir dann aufgefallen, das ich die ganze Zeit nur von einem Server ausgegangen bin.

Deswegen habe ich die zweite Idee erweitert um noch ein paar zusätzliche "Game"-Server, außerdem hab ich für den nächsten Schritt vielleicht noch einen Meta-Server geplant, auf dem Dinge wie Login usw. gehandelt werden.

Nachfolgend meine Gedanken im Bild zusammengefasst XD

(Link)


Nun bin ich nicht der Experte was eine solche Architektur angeht. Habt ihr Erfahrungen mit dem Thema gemacht und möglicherweise einige wichtige Tipps?

Grundlegend sollen folgende Funktionen realisiert werden.
-Login
-Lobby
-Bis zu 8 Spieler pro Server/Lobby.
-Freunde System

Vielleicht nochmal eine kleine Erklärung zu Lobby. Die Lobby ist einfach ein Raum, indem sich mehrer Spieler treffen. In der Lobby kann der Ersteller Einstellungen für das Spiel vornehmen und wenn alle Bereit sind, kann er das Spiel starten.
Bestehende Lobbys werden für Spieler aufgelistet und sie können diese betreten.

Beste Grüße,
Jar

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

03.01.2017, 14:21

Früher (tm) haben Unreal, Quake und Konsorten das so gemacht: Du kannst Dir einen Server mieten oder selbst hosten. Das Server-Programm registriert sich beim Start bei einem Master-Server, an den auch die Server-Browser-Queries der Clients geschickt werden. Jeder Server meldet sich also mit seinen aktuellen Daten "Spielmodus XYZ mit 3/8 Spielern auf Karte FooBar" beim Masterserver. Clients können den Masterserver abfragen "gib mir alle nicht-leeren Server, auf denen gerade Spielmodus XYZ läuft" und kriegen eine Liste von IPs, mit denen sie sich verbinden können.

Heute ist es (auf Konsolen und vielen dämlichen PC-Konvertierungen) üblich, dass Du so ne Art MatchMaking benutzt. Der Spieler schickt seine Spielwünsche an einen Masterserver und der Masterserver sammelt Spieler-Requests und erstellt neue Serverinstanzen auf einem Server-Array. Oder auf dem heimischen Rechner eines der Spieler - Call Of Duty macht das z.B. so. Weil da der Spieler ja jederzeit aussteigen kann, gibt es dort dann eine sogenannte Host Migration, bei der das Spiel kurz unterbrochen wird, während der scheidende Spieler den kompletten Game State an jemand anderen überträgt und alle Clients dann beim Neuen connecten.

Eine "Lobby" war für mich allerdings immer ein Game State, keine Infrastruktur-Frage. Also "Lobby" bedeutet für mich, dass Clients/Spieler schon auf einer konkreten Server-Instanz connected sind und miteinander chatten können, aber noch kein aktives Spiel läuft.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

3

03.01.2017, 14:34

Schließe mich Schrompf an - eigentlich gehört die Lobby zum GameServer und findet einfach nur statt, bevor der GameServer das Spiel startet. Die Verbindung muss vorher hergestellt werden.

Du könntest jetzt eigene Login-Server implementieren, mit denen sich grundsätzlich alle Spieler verbinden und mit Hilfe dessen sich die Spieler finden können. Die GameServer rufen dann nur noch Daten von dort ab falls nötig. Oder halt sowas wie Steam nutzen, dass dir das schon abnimmt.

Ob deine GameServer jetzt von Spielern erstellt werden oder nur dediziert sind, hängt ja noch von einigen anderen Faktoren ab.
WIP Website: kevinheese.de

Jar

Treue Seele

  • »Jar« ist der Autor dieses Themas

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

4

03.01.2017, 15:06

Der Spieler schickt seine Spielwünsche an einen Masterserver und der Masterserver sammelt Spieler-Requests und erstellt neue Serverinstanzen auf einem Server-Array.

Was genau ist mit dem Server-Array gemeint?

Und die Heute Variante hatte ich für aufwendig und nicht mehr zeitgemäß erachtet. Aber wenn das wirklich noch gemacht wird, was die Serverlast natürlich extrem reduzieren würden, würde ich das nochmal probieren.
Könnte man das auch so realisieren, dass der GameState auf dem Server gespeichert wird, wenn alle Spieler discontected sind. Dann müsste allerdings der Server immer wieder bei demjenigen gestartet werden, der sich als erstes einloggt...

Als zusätzliche Info:
Das Spiel besteht aus Runden und Zügen in jedem Zug kann ein Spieler würfeln und dann entsprechend Felder ziehen.
Wenn er mit seinem Zug fertig ist, ist der nächste dran. Wenn alle ihre Züge beendet haben, ist die Runde vorbei.
Außerdem gibt es einen weiteren Spiel-Modus, indem alle Spieler gleichzeitig würfeln und ziehen können, hier gilt die gleiche Endbedingung wie oben.

Wie würdet ihr das machen?

Okay das mit der Lobby ist vielleicht ein wenig falsch formuliert. Die Clients sind tatsächlich schon auf einem Server connected, auf dem sie dann eine Lobby erstellen können.
Das könnte sogar der angesprochene META Server werden.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

03.01.2017, 15:37

Hm, mir scheint, Du hast da ein Verständnisproblem.

Der grundlegende Spielablauf eines Netzwerkspiels sieht so aus:
- Spieler schicken Spielaktionen an den Server
- der Server berechnet daraus den Folgezustand der Spielwelt
- der Server überträgt die sich ergebenden Änderungen an alle Spieler.

Wie genau Deine Spielmechanik aussieht, ist dabei irrelevant. Das mischen wir bitte nicht auch noch in das Thema rein.

Wenn ein Spieler einem Spiel beitritt, sieht das so aus:
- Spieler connected auf IP
- Server überträgt aktuellen Spielzustand an den neuen Spieler
- weiter wie oben

Wenn noch kein Spiel läuft, aber Spieler joinen, ist der aktuelle Spielzustand halt "nix" und alle können nur chatten, bis irgendwas ein Spiel startet. Das ist mein Verständnis von "Lobby".

Von all dem unabhängig ist die Frage, wie ein Spieler einen Server findet, auf dem er mitmachen will. Das kannst Du oldschool über einen Serverbrowser machen. Oder Du baust einen Master Server, bei dem Spieler nur ihren Mitmach-Wunsch mit Parametern anmelden. Und wenn sich genügend Spieler gemeldet haben, startet der Master Server auf irgendner Hardware eine Spielserver-Instanz und gibt allen wartenden Spielern die IP davon, so dass die dort zusammen zocken können. Das "Server-Array" ist also nur ein Bündel verfügbare Hardware, auf denen Du neue Prozesse spawnst, wenn es Kundschaft gibt. Und wie gesagt: Call Of Duty hat schon seit Ewigkeiten keine eigene Hardware mehr dafür, sondern nutzt die Konsole/den PC eines der Spieler, um ein Spiel zu hosten.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Jar

Treue Seele

  • »Jar« ist der Autor dieses Themas

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

6

03.01.2017, 15:53

Danke schon Mal für die Anregungen. Den Ansatz von Call of Duty werde ich auf jeden Fall einmal durch designen.

Hm, mir scheint, Du hast da ein Verständnisproblem.

Das ist mir durchaus bekannt, kam aber wohl falsch rüber. Mit dem Ablauf des Spiels wollte ich nur darauf hinweisen, dass es sein kann, das Spieler nicht durchgehend an ihrem Gerät (Smartphone oder PC) sitzen und es keine durchgehende Verbindung gibt.

Die daraus resultierende Problematik lässt mich derzeit noch grübeln.

Wenn noch kein Spiel läuft, aber Spieler joinen, ist der aktuelle Spielzustand halt "nix" und alle können nur chatten, bis irgendwas ein Spiel startet. Das ist mein Verständnis von "Lobby".

Beim ersten Teil stimme ich dir zu. Beim zweiten ist es so gemeint, das ein Spieler eine Lobby erstellt, man kann sich das auch als Raum vorstellen an dem an der Tür ein Zettel hängt an dem steht was es drinnen so gibt. Andere Spieler sehen dann, dass es einen offenen Raum gibt und sehen die Notizen auf dem Zettel. Wenn ihnen die Informationen gefallen können sie den Raum betreten. Ist der Raum allerdings voll, kann der Ersteller entscheiden ob das Spiel beginnt. Dann verschwindet der Raum im Nirvana und ein Server wird gestartet auf dem alle Spieler aus dem Raum connecten und anfangen zu spielen.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

03.01.2017, 15:57

Der "Raum" *ist* der Server. Ein Spielserver ist im Zustand "Lobby", also nur ein leerer Raum ohne Spielwelt, in dem 0 bis x Spieler sind. Dann startet das Spiel, der Server schickt den initialen Weltzustand an alle Spieler und das Spiel läuft.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Jar

Treue Seele

  • »Jar« ist der Autor dieses Themas

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

8

03.01.2017, 16:24

Achso... du meinst, dass man sobald man den "Raum" erstellt, der Spiel-Server beim Ersteller des Raumes gestartet werden sollte?
Alle Spieler joinen dann dem Spiel-Server und befinden sich dann in der Lobby bzw. sind im Zustand Lobby?

(Link)

Habe ich das so richtig verstanden? Hört sich gut an.

Würde der Spiel-Server mit dem "Meta-Server" regelmäßig seinen Zustand austauschen, damit im Falle des Disconnectens des Host ein anderer Spieler Hosten kann?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Jar« (03.01.2017, 16:39)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

9

03.01.2017, 16:37

Und wie gesagt: Call Of Duty hat schon seit Ewigkeiten keine eigene Hardware mehr dafür, sondern nutzt die Konsole/den PC eines der Spieler, um ein Spiel zu hosten.

Das ist aus meiner Sicht für competitive MP-Titel übrigens sehr schlecht. Dadurch hat ein Spieler (der Host) einen großen Vorteil weil sein Ping 0 ist (Er hostet ja den Server). Ich persönlich bin auf jeden Fall ein Fan von dedicated Servern (die auch von den Spielern erstellt werden können), aber leider gibt es das immer weniger :(
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Jar

Treue Seele

  • »Jar« ist der Autor dieses Themas

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

10

03.01.2017, 16:55

Zum Glück habe ich keinen competitiven MP-Titel :) Das Problem kann ich mit gutem Gewissen ausschließen.
Mein Spiel könnte zwar auch die Möglichkeit bieten, den Server selbst zu erstellen, aber da ich das erste Mal auch mit der mobilen Entwicklung experimentiere, bin ich mir nicht sicher ob es so einfach mit Android oder IOS realisiert werden kann.

Werbeanzeige