Frage von nyaaa844, 6

Problem bei Definierung von Netzwerkschnittstellen bei Host und Client (Spiel)?

Ich mache gerade ein Spiel, oder besser gesagt einen Spielemaker, womit man einfachst und mit möglichst wenig Programmiererfahrung ein Spiel machen kann. Darauf hin bin ich auf ein Problem gestoßen, was sich leider nicht ganz so einfach lösen lässt. Nämlich sollen die Spiele, die damit gemacht werden, auch im Mulitplayer funktionieren. Sprich ich brauche einen Host und einen Client. Wobei der Host (das ist der Server, worauf dann die ganze Logik läuft) hier die Regeln des Spiels festlegt, und der Client (das ist dann der, der das Spiel wirklich spielen will) auf den Host zugreift um das Spiel zu spielen. Hierbei habe ich Probleme beim zugreifen und beim "Wie?". Client und Host müssen über definierte Schnittstellen zusammen kommunizieren, damit ein Multiplayer möglich ist. Im Grunde genommen gibt es im Host eine logische Umgebung und in dieser wiederum einen Charakter, den der Client Steuern darf. Minimieren wir hierbei das Steuern auf bewegen (will's einfach halten). Da alle Regeln im Host definiert sind, muss natürlich er bestimmen wie sich der Charakter bewegen darf. Dazu habe ich jetzt 2 Methoden entwickelt:

  1. Methode: Der Client sendet dem Host, was er machen will (zum Beispiel sendet der Client dem Host, dass er gerade die Taste "W" gedrückt hat) und der Host rechnet daraufhin die neue Position des Charakters aus (sprich, der Charakter geht nach vorne)

  2. Methode: Der Client sendet dem Host nicht was er machen will, sondern rechnet die Position gleich selber aus und sendet ihm das Ergebnis. Darauf hin kontrolliert der Host die vom Client gesendeten Werte, ob sie den Regeln entsprechen. Hierbei existiert aber ein kleines Problem: Der Client hat die Regeln nicht.

Jetzt ist halt die Frage, welches davon am optimalsten wäre (oder vielleicht habt ihr noch andere Methoden?). Die erste verwende ich ungern, da es irgendwann ziemlich viele Kontrollmöglichkeiten geben wird und auch ziemlich viele Spieler, sodass der Host eine ziemlich enorme Rechenleistung aufwenden musst. Auf der anderen Seite ist halt die Frage, ob es geschickt ist, den Client seine Positionen berechnen zu lassen, uns was noch viel wichtiger ist, wie genau er das machen soll (da der Client die Regeln nicht hat). Der Host könnte sie dem Client natürlich senden, aber ist das wirklich gut? Oder soll ich einfach eine minimalistische vorm der neuen Position zum Host schicken (einfach die Richtung, in der ich gehen will) und der Host passt diese dann auf seine Regeln an?

Ich hoffe ihr könnt mir helfen, weil ich merke gerade, dass ich ziemlich viel Text geschrieben habe c:

mfg nyaa844

Antwort
von WhiteGandalf, 6

Generell solltest Du die Spiellogik aufteilen in Dinge, die nach Regeln geregelt sein MÜSSEN - eben die Spielregeln, die "vertraglich verbindliche" Normen für die Spieler darstellen -, und Dinge, die nur die Darstellung der Spielwelt betreffen. Ersteres gehört konsequent immer in den Server, denn jede Abweichung davon WERDEN Gauner mit Hacking beantworten. Und zu Gaunereien ist die große Masse aller Teilnehmer mit Freuden bereit. Und dann ist es der Serverbetreiber, der berechtigterweise im Zentrum der Entrüstung aller halbwegs anständigen Durchschnittsspieler steht und sein Ansehen verliert.

Du selbst hast das bereits korrekt in der Frage dargestellt: Du müsstest SOWIESO JEDE Aktion eines Clients, die dieser für sich selbst berechnet, durch den Server nachrechnen lassen. Du kommst um das Berechnen im Server nicht drumrum. Das ist ein Naturgesetz: Du hast es hier auf diesem Planeten mit egozentrischen Arsc.löchern zu tun, die von Affen abstammen, und die nur im Nachhinein mit etwas Glück in ihrer Kindheit zu einigermaßen anständigem Verhalten zurechtgebogen werden. Zu einem gewissen Prozentsatz. Du MUSST Dich zwingend darauf einstellen, dass dieser Prozentsatz keine Rekordsprünge veranstaltet. Das tat er noch nie.

Um der Rechenleistung gerecht zu werden, beschränkst Du das regel-relevante Spielsystem. Und zwar auf etwas, was einfach zu berechnen IST. Außerdem beschränkst Du die Anzahl der Spieler pro Server.

Und das ist kein Kunststück oder gar selten: Kein aktuelles Multiplayer-Action-Spiel macht mehr als ein paar Zufallswürfel pro Spieler und Sekunde zu berechnen und ein paar einfache Koordinatenrechnungen anzustellen. Das ist einer der Gründe, warum es so viele Fans von Uralt-Spielen gibt, die umgebremsten Zulauf haben: Am Spiel-INHALT hat sich seit 30 Jahren nichts geändert. Nur die Darstellung der Spielwelt ist von Strichzeichnungen allmählich zu 3D-Welten mit immer ausgefeilteren Beleuchtungssystemen gewechselt. Und immer mehr Elemente-Bewegungen in der 3D-Spielwelt werden mit immer ausgefeilteren Physik-Simulatoren berechnet. Aber da geht's immer nur um optische Gimmicks, nie um Spiel-INHALTE. Wenn irgendwo ein Felsen in einer krass realistischen Darstellung zerspratzt, hat das für den Spielinhalt keinerlei Auswirkung: Dort zählt nur, ob der Felsen an seiner Stelle steht oder nicht. Eventuell noch, wie weit seine Beschädigung reicht (eine einfache Zahl). Die spieltechnisch relevanten INHALTE von Spielwelten werden immer blockweise und dabei sehr grob berechnet. Alles andere dient nur dem Beeindrucken des naiv-gläubigen Spielers.

Wenn ein Spieldesigner die Sache korrekt angeht, ist es auch überhaupt kein Problem, dass sein Spiel gleichzeitig von Leuten mit sehr verschiedener Hard- und Software gespielt wird. Was ohnehin eine Voraussetzung dafür ist, dass ein Spiel populär werden kann: Je schmaler der Bereich von Kunden, desto kleiner die Kundschaft und desto größer der Frust - bei älteren Kunden, dass sie einfach wegen spielinhaltlich irrelevanter Gimmicks rausgekickt werden, und bei jüngeren Kunden, dass ihre mega-krass.gei.le Hyper-Baller-Hardware so ganz und gar nicht ausgereizt wird.

Also von daher: Denke gründlich drüber nach, was spielinhaltlich relevant ist und trenne das gründlich von dem, was der puren Darstellung und Augenweide dient! Lasse ersteres konsequent auf dem Server berechnen, letzteres konsequent auf den Clients! Und richte Dich darauf ein, dass letzteres ein großes Streufeld abdecken können muss, wenn Du Erfolg haben willst!

Kommentar von nyaaa844 ,

Danke für die schöne, lange und ausführliche Antwort! Hilft mir auf jeden Fall weiter.

Keine passende Antwort gefunden?

Fragen Sie die Community