Wie kann ich Client und Server gleichzeitig effizient codieren?

15

Ich codiere mein Spiel mit einem Client-Server-Modell. Beim Spielen im Einzelspieler-Modus startet das Spiel einen lokalen Server und interagiert mit ihm wie mit einem Remote-Server (Mehrspieler). Ich habe dies getan, um zu vermeiden, dass Einzelspieler- und Mehrspieler-Code getrennt codiert werden.

Ich habe gerade mit dem Codieren begonnen und bin auf ein großes Problem gestoßen. Derzeit entwickle ich das Spiel in Eclipse, wobei alle Spielklassen in Paketen organisiert sind. Dann verwende ich in meinem Servercode einfach alle Klassen in den Client-Paketen.

Das Problem ist, dass diese Clientklassen renderspezifische Variablen haben, die auf einem Server offensichtlich nicht ausgeführt würden.

Soll ich geänderte Versionen der Clientklassen erstellen, die auf dem Server verwendet werden sollen? Oder sollte ich einfach die Client-Klassen mit einem Booleschen Wert ändern, um anzugeben, ob der Client / Server ihn verwendet. Gibt es noch andere Möglichkeiten, die ich habe? Ich habe gerade darüber nachgedacht, die Serverklasse als Kernklasse zu verwenden und sie dann mit Rendering-Elementen zu erweitern.

Liamzebedee
quelle
Haben Sie Pre-Prozessor-Optionen? Wie #ifdef CLIENT <irgendein Code> #endif. Dies ist eine einfache Möglichkeit, gemeinsam genutzte Klassendateien zu haben, die sich zwischen Server und Client unterscheiden können, und Teile auch gemeinsam zu nutzen. Es ist ein bisschen chaotisch.
William Mariager
Ich stimme MindWorX zu. Bedingte Kompilierung ist in Java zwar ein Problem, es gibt jedoch Lösungen , die in Betracht gezogen werden sollten.
Sam Hocevar
1
Bedingte Kompilierung ist eine grobe Art und Weise zu sagen: "Ich habe nicht genug Design-Zeit in meine Pakete gesteckt". Ein halbes Jahr später, wenn Sie sogar Ihren eigenen Code erneut lesen und für alles andere als Wegwerfprototypen kontraproduktiv sind.
Patrick Hughes

Antworten:

23

Sie sollten es vorziehen, Ihren Rendering-Code von Ihrer Spielelogik zu trennen, da es sich um separate Probleme handelt .

Wenn Sie Ihren Rendering-Code von Ihrem Client / Server-Code trennen, erhalten Sie einige Vorteile:

  • Das Erstellen eines dedizierten Servers wird einfacher, da sich jeder wiedergegebene Code an einer Stelle befindet.
  • Sie können Ihre updatePhase von Ihrer renderPhase trennen und in unterschiedlichen Zeitschritten ausführen.
  • Sie können sicherstellen, dass Ihr Rendering-Code den Spielstatus nicht verändert const, indem Sie Fehler reduzieren.
Blair Holloway
quelle
1
+1 Ich kann diesem Gefühl nicht mehr zustimmen. Wenn Sie die Datenmodellierung von den gerenderten Ansichten dieses Modells trennen, können Sie auf saubere Weise mehrere Fenster ausführen, die unterschiedliche Informationen anzeigen, das Rendern auf andere Plattformen übertragen, Analysen hinzufügen und Ihre Simulation für das Gameplay optimieren, ohne 90% Ihrer Codebasis berühren zu müssen .
Patrick Hughes
5

Ich denke, Sie sollten Client- und Server-Code sauber trennen. Der Servercode und der Clientcode sollten einander nicht kennen, mit Ausnahme der Funktionen, die mit Schnittstellen verfügbar gemacht werden. Der Server soll nichts über Rendering wissen, nur Clients registrieren, Positionen, Zeit usw. verfolgen. Wenn Sie Bedenken sauber getrennt haben, ist es einfacher, Ihr Spiel zu pflegen und weiterzuentwickeln. Hoffe das hilft ein bisschen.

loodakrawa
quelle
+1 Ich stimme dem eher zu. Wenn auf dem Server Clients ausgeführt werden, sollten diese als separate Prozesse ausgeführt werden.
Ingenieur
5

Trennung von Anliegen FTW, wie die anderen gesagt haben, aber wenn Ihr Endziel darin besteht, Client- und Serveranwendungen zu trennen, müssen Sie noch einen Schritt weiter gehen. Sie müssen bestimmen, was clientspezifisch, was serverspezifisch und was gemeinsam genutzt wird. Teilen Sie alles, was gemeinsam genutzt wird, in Klassen von ausschließlich gemeinsam genutztem Code auf. Client- oder serverspezifische Klassen können dann die gemeinsam genutzten Klassen nach Bedarf in Unterklassen unterteilen oder darauf verweisen. Verschieben Sie die gemeinsam genutzten Klassen in ein separates Projekt, erstellen Sie eine JAR-Datei mit "gemeinsam genutzter Bibliothek" und fügen Sie diese JAR-Datei sowohl in das Client- als auch in das Serverprojekt ein.

Dies hat ein paar Vorteile: Es macht die Trennung von Anliegen glasklar, alles in getrennten Projekten zu halten; Es stellt sicher, dass Client und Server mit demselben gemeinsam genutzten Code starten (sofern sie dieselbe Version der gemeinsam genutzten JAR verwenden). und es macht es unmöglich, "versehentlich" gemeinsam genutzten Code zu ändern, ohne es zu bemerken. Wenn sich der freigegebene Code in einem eigenen Projekt befindet, wissen Sie beim Bearbeiten von Elementen in diesem Projekt, dass Sie wissen müssen, wie sich die Änderungen sowohl auf den Client als auch auf den Server auswirken.

Adrian
quelle