# Server/Client Struktur Multiplayer



## c_sidi90 (21. Nov 2011)

Kennt jemand einen guten Artikel oder Tutorial für eine Client/Serverstruktur für ein Online/Netzwerk Multiplayer Spiel? Ich benötige dringend Informationen, welche Aufgaben vom Server übernommen werden und welche vom Client. Welche Vorgehensweise ist üblich, Zeichenoperationen auf der Clientseite vorzunehmen, welche vom Server gesendet werden?

Lg


----------



## yyannekk (22. Nov 2011)

Prinzipiel würde ich sagen ist der Server für die Spiellogik zuständig, d.h. der Client sendet seinen Input an den Server, dieser berechnet die aktuelle Situation und schildert Veränderungen dem oder den Clienten. Jeder Client für sich entscheidet dann was bei ihm gezeichnet wird. So in etwa mache ich es zumindest.
Der Client könnte noch die Aufgabe übernehmen temporär selber die Position der eigenen Spielfigur auszurechnen (um sie später gegebenenfalls zu korrigieren, falls der Server etwas anderes berechnet hat), damit man nicht immer warten muss bis die Daten beim Server ausgewertet sind (sagen wir du drückst bei dir eine Taste, bis der Server das ausgewertet und zu dir zurückgesendet hat vergeht halt ne Weile, wenn du deine Figur dann immer erst zeichnen würdest wenn die Daten vom Server zurückgekommen sind, hast du ein Performance Problem)

Dann würde ich sagen kommt es drauf an ob dein Spiel rundenbasiert oder in Echtzeit ablaufen soll. Rundenbasiert ist relativ einfach. Client der dran ist macht Eingabe --> Daten an Server ----> Berechnen ---> Daten senden an alle Clienten... Warten auf Eingabe von nächstem Clienten.... 

Wenns in Echtzeit ablaufen soll ist es komplizierter, da müsste man sich nochmal genau überlegen wie die Synchronisation abläuft.


----------



## c_sidi90 (22. Nov 2011)

Danke schonmal für deinen Beitrag. So waren auch meine ersten Gedankengänge, ich hoffe jedoch das noch weitere Vorschläge kommen da ich es von beginn an richtig machen möchte. 

Das spiel habe ich damals in c++ geschrieben und bin gerade dabei es in Java zu portieren. Es ist Echzeit Rpg/Shooter in 3D, hatte mich da bisschen an Fallout angelehnt, zumindest von der Idee, nicht der Grafik


----------



## babuschka (23. Nov 2011)

> Kennt jemand einen guten Artikel oder Tutorial für eine Client/Serverstruktur für ein Online/Netzwerk Multiplayer Spiel?


Schau Dir mal die Bücher "Game Engine Architecture" und "Game Programming Gems" an - einfach in der  Bücherei Deines Vertrauens nachfragen, vielleicht kannst Du sie dort leihen.



> Ich benötige dringend Informationen, welche Aufgaben vom Server übernommen werden und welche vom Client


Meine persönlichen Erfahrungen als Spieler/Spiel-Administrator und Hobby-Spieleprogrammierer:

Bei Shootern ist ein Multiplayersystem natürlich besonders schwierig, da eigentlich alle Lösungen ihre Nachteile haben - besonders bei höheren Latenzzeiten. Prinzipiell wird die Grafik auf den Clients ausgeführt, währenddem die Spiellogik auch auf beiden Instanzen laufen kann/muss. Wichtig ist auch, dass Du auch ein Entity-System hast, das eine einfache Netzwerkunterstützung zulässt! Wenn die Gesamtarchitektur das nicht zulässt wird das mit dem Netzwerk wohl nie was werden...

Besonders oft verwendet werden client- und serverseitige Interpolation der Objektpositionen, allerdings eher selten in Reinkultur sondern eher in Mischformen.

Findet eine Clientseitige Interpolation statt, so verwalten die Clients selbst ihre Positionen und der Server validiert diese ggf. Die Logik läuft nur auf dem Client bzw. optional auch auf dem Server.
Diese Architektur alleine ist jedoch eher weniger für schnelle Spiele wie Shooter geeignet.
Weiterhin ist hier das Cheaten (->Flyhack, Wallhack und sonstige Sauereien ) hier wesentlich einfacher, ausserdem "laggen" Spieler mit höheren Pings für alle anderen Spieler - je nach Ping ist es dann für andere Spieler beinahe unmöglich, den "Lagger" zu treffen, da dessen Position und Bewegung nie konsistent, sondern sprunghaft dargestellt werden.:noe:. 

Bei einer serverseitigen Positionsinterpolation kontrolliert der Server sämtliche Objektpositionen und sendet diese an die Clients. Hier kann das Spiel jedoch für alle Spieler unspielbar machen, da bei hohen Pings ständig ihre Positionen korrigiert würden - ein Problem, das man auch in teureren und gut bekannten Spielen leider auch oft sieht. 

Ideal wäre wohl eine Mischung der beiden Methoden, in der die Clients ihre Position selbst interpolieren und nur bei zu großen Abweichungen ihre Position korrigieren. Spielentscheidend ist dann die Position der Objekte auf dem Server.

Außerdem musst Du Dir Gedanken über die Art der Kommunikation ("Ich öffne die Kiste A an X|Y|Z" statt "Ich nehme eine Billiarde Dollar aus einer Kiste" - auch oft gesehen:noe und eine Prüfung der Konsistenz der Dateien machen - sonst kann jeder Spieler z.B. die Grafikdateien verändern und so z.B. Spielerpositionen herausfinden (->Aimbots) Wände durchsichtig/passierbar machen oder Spielern eine andere Farbe geben, ohne dass dies je bemerkt würde... Letzten Endes wird es allerdings immer Cheater geben, deshalb solltest Du neben einer wirksamen Anticheatmethode auch ein Administrationssystem einführen, sodass sich Administratoren um die lästigen Cheater kümmern können.

Wie Du siehst: es ist ein sehr weites Feld, in dem man vermutlich einige Doktorarbeiten schreiben kann...


----------



## c_sidi90 (23. Nov 2011)

Klasse! Ich danke dir sehr für deinen ausführlichen Beitrag! Das das ein größeres Themengebiet ist war mir klar, denke mal ich bin da auch mindestens 1 Jahr mit beschäftigt. Das Spiel im Singleplayer hatte zu 3. schon 2 Jahre gedauert  Werde versuchen alle Wege zu analysieren und einen brauchbaren Mittelweg rauszufiltern. Für weitere Tipps von euch wäre ich dankbar!


----------



## Massenhaft (24. Nov 2011)

c_sidi90 hat gesagt.:


> Für weitere Tipps von euch wäre ich dankbar!



Hab mich auch mal an einen 2d-Shooter versucht und div. Techniken von Quake und Valve eingesetzt. Es lief ganz gut...konnte es leider nie ausführlich testen. Den Source-Code findest du unter:
slick-netty-network-game-example - An UDP 2d netwok game example - Google Project Hosting

- Am besten auschecken -

Hab netty als Netzwerklib und artemis als Entitysystem genutzt....

Viel Spaß
Andreas


----------



## Evil-Devil (24. Nov 2011)

Die UnrealEngine zb. nutzt das gemischte Verfahren. Wichtige Dinge werden zum Server repliziert und weniger wichtige nicht.

Einen guten Einblick in die Art und Weise liefert nachfolgende Doku.
UDN - Three - NetworkingOverview


----------



## c_sidi90 (24. Nov 2011)

Sehr interessantes Lesematerial, danke dir dafür. Ich denke ich werd es genauso machen, und die Clients zum großteil nur fürs Rendering benutzen und die gesamte Logik vom Server bewältigen lassen. Leider hatte ich zu Beginn genau den anderen Weg eingeschlagen und muss nun vieles ändern. Hatte sich allerdings immer mehr als Deadend ergeben das ganze :lol:


----------



## Kr0e (25. Nov 2011)

Vieles wurde ja bereits gesagt... Als letztes vlt noch der Tipp, dass es bereits fertige Gameengines wie jME3 gibt, wo auch schon was zum Netzwerk angeboten wird.

Ansonten gibt es RedDwarf, was ein OpenSource GameServer ist (in Java natürlich). Ausgelegt für RPGs oder ähnlcihes. Project Wonderland läuft darüber...

Ich persönlich würde es vermutlcih aber selbst machen, einfach weils Spaß machjt 

Gruß,

Chris


----------



## c_sidi90 (26. Nov 2011)

Kr0e hat gesagt.:


> Ich persönlich würde es vermutlcih aber selbst machen, einfach weils Spaß machjt
> 
> 
> 
> Chris



Da wir das ganze Spiel auch selbst geschrieben haben ohne andere Frameworks würden wir es auch gerne selbstschreiben. Danke für dein Tipp werden uns den Source mal anschauen und eventuell einige Sachen daraus gebrauchen.


----------

