Wie lässt sich Netzwerkcode in späteren Phasen der Entwicklung schreiben?

12

Ich bin gerade dabei, ein Spiel zu schreiben, das ich in den meisten Aspekten verbessern möchte.
Wie kann ich das Schreiben von Netzwerkcode überspringen und es dennoch ziemlich einfach implementieren, das heißt, ich muss nicht das gesamte Spiel neu schreiben, um es hinzuzufügen?
Was muss ich beachten?

Ich habe ein Komponentenmuster, in dem ich Physik / Kollisionserkennung, Spielelogik, Datentypen und Animation / Rendering voneinander trenne.
Wie schreibe ich einen Client und einen Server, auf denen noch kein Netzwerkcode implementiert ist und der lokal getestet werden kann?
Was soll ich auf dem Client und was auf dem Server tun? Soll ich einfach so tun, als wäre der Netzwerkcode fertig und ich sende Nachrichten zwischen Server und Client und rechne für Verzögerungen usw. ab, obwohl es keine geben wird?

Bearbeiten: Es ist geplant, ein Top-Down-RPG zu sein. Ich denke, ein einfacher Mehrspielermodus, in dem Sie einen Server für Ihre Freunde hosten, ist nicht so schlimm (wer würde gerne mit betrügenden Freunden spielen?). Trotzdem würde ich gerne mit einem "Der Server ist immer richtig" -Ansatz weitermachen.

Edit 2: Ich schätze, ich suche nach Hinweisen, wie meine Denkweise aussehen sollte. Wie soll ich mit Tastatureingaben, Animationen usw. umgehen, anstatt jeden Effekt / jede Änderung sofort anzuwenden? Hmmm, ich muss mich vielleicht erst richtig über das Networking informieren, bevor ich irgendwohin gehe. Davon hatte ich gehofft, ein Netzwerkskelett zu erstellen, das lokal funktionieren könnte.

Ghork
quelle
Das hängt sehr stark davon ab, wie Sie Ihren Netzwerkcode implementieren möchten, wenn Sie dort ankommen. Quake (oder ein späterer ID-Titel, vielleicht ist mein Gedächtnis etwas unscharf) zum Beispiel ging davon aus, immer Client / Server zu sein. Sogar die Einzelspieler-Option stellt bei 127.0.0.1 eine Verbindung zu einem Server her und lädt keine anderen Spieler ein. Das bedeutet, dass sogar das Einzelspieler-Spiel vollständig über den Netzwerkcode ausgeführt wird.
LLL79
Das war genau das, was ich mir vorgestellt hatte. Möglicherweise eine Kommunikation zwischen Prozessen, sodass Sie keine Verbindung herstellen müssen, wenn Sie alleine spielen möchten, oder eine Klasse, die die gleichen Funktionen wie der Client hat, diese jedoch wie der Server behandelt.
Ghork
3
Die beste Praxis ist seit geraumer Zeit "nicht". Wenn Sie kein rundenbasiertes Spiel schreiben, müssen Sie die Dinge einfach anders gestalten, um mit dem Networking umzugehen. Wenn Ihnen Latenz, Korrektheit und Betrug am Herzen liegen, gibt es einfach keinen Ausweg. Wenn Sie dies nicht tun, müssen Sie nicht viel darüber nachdenken. Wenn Sie nicht die Erfahrung haben, können Sie das richtige Design ohnehin nicht gut genug vorhersagen. Der beste Weg ist, sich mit ein paar vernetzten Prototypen vertraut zu machen, um wirklich Netzwerkerfahrung zu sammeln.
Luaan,
Wenn Sie daran denken, Minecraft hat einen lokalen Server auch in Einzelspieler-Spielen. Der Server ist die Engine, der Client ist nur ein Moderator.
SparK

Antworten:

12

Ohne mehr über das genaue Spiel zu wissen, das Sie schreiben, und wie Sie es schreiben, ist es sehr schwierig, generische Lösungen für Ihr Problem zu finden.

Möglicherweise möchten Sie jedoch überlegen, ob Sie den Netzwerkcode bis zum Ende beibehalten möchten. Dies hängt davon ab, wie wichtig das Netzwerk für Ihr Spiel ist.

Ich meine, wenn Sie ein netzwerklastiges Spiel wie ein MMORPG schreiben, ist es möglicherweise nicht ratsam, die Vernetzung zu beenden.

Wenn die Auswirkungen, die Sie für den Netzwerkcode erwarten, gering sind (z. B. wenn kein Netzwerkcode vorhanden ist, ist dies kein Spielbrecher), kann es angebracht sein, ihn für eine spätere (aber nicht zu späte) Phase zu belassen.

Denken Sie daran, dass -writing- Networking-Code nicht mit -thinking- identisch ist. Wenn Sie Entscheidungen über die Art und Weise treffen, in der Ihr Spiel erstellt wird, sollten Sie überlegen, wie sich dies auf Netzwerkentscheidungen auswirkt. Wenn die erwarteten Auswirkungen hoch sind, implementieren Sie es möglicherweise als Stub, der einige allgemeine Informationen enthält, und dann, wenn es Zeit ist, das Netzwerk zu erstellen Code, es ist nur eine Frage des Einsteckens, wo Sie den Stub verlassen haben.

Wenn Sie beispielsweise ein Online-Schachspiel erstellen, haben Sie möglicherweise eine Funktion namens ExecuteMove() die auf eine Weise wird, wenn ein Zug mit der Maus eingegeben wird, und auf eine andere Weise, wenn ein Zug über die Tastatur eingegeben wird. Möglicherweise möchten Sie an dieser Stelle einen Netzwerk-Stub erstellen, der nach dem Abrufen der erforderlichen Daten vom anderen Host (dies wird in einem späteren Teil geschrieben) aufgerufen wird ExecuteMove().

Auf diese Weise wissen Sie beim Erstellen Ihres Spiels, welche Teile vom Netzwerkcode betroffen sind, und wenn es Zeit ist, den Netzwerkcode tatsächlich zu schreiben, sind Sie mehrere Schritte voraus.

Wenn Sie zum ersten Mal ein vernetztes Spiel schreiben, sollten Sie nicht zu viel über Betrugsbekämpfung und ähnliches nachdenken. Ein vernetztes Spiel zu erstellen ist komplex genug, um ein ganzes Team von erfahrenen Leuten für ein AAA-Spiel zu benötigen. Machen Sie es also langsam und erstellen Sie zuerst ein Spiel, das funktioniert, bevor Sie sich auf komplexere Themen konzentrieren.

Wenn Sie zum ersten Mal ein Spiel machen, machen Sie es bitte nicht vernetzt. Das Erstellen eines Spiels ist so komplex, dass jede Anforderung, die Sie Ihrem Spiel hinzufügen, es exponentiell komplexer macht.

Panda-Pyjama
quelle
Nun, es ist kein MMO, also wird es nicht SO schwer für das Networking sein. Es ist jedoch kein altbackenes Brettspiel, bei dem es in Ordnung ist, Sekunden zu brauchen, bevor ein Zug ausgeführt wird. Ich bin der Meinung, dass an das Networking früh gedacht werden sollte, da das Hinzufügen von Multiplayer in den letzten Phasen meiner Erfahrung nach nicht funktionieren wird. Ich möchte jedoch keinen Netzwerkcode schreiben und das debuggen, bevor ich meinen Charakter dazu bringen kann, sich zu bewegen und mit Objekten zu kollidieren.
Ghork
2
@Ghork: Ah, Sie möchten, dass Ihr Produkt so schnell wie möglich hübsche Dinge tut! Nun ja, das tun wir alle. Aber dieser Versuchung zu erliegen, wird nicht zu einem gut durchdachten Programm führen.
Leichtigkeit Rennen mit Monica
Ich werde diese Antwort akzeptieren, auch wenn mir die anderen Antworten gefallen. Insbesondere der Kommentar von @Luaan
Ghork
2

Ich bin in einer ähnlichen Situation, aber ich versuche, eine Netzwerksimulation mehr als ein Spiel durchzuführen. aber ich denke, dass mein Ansatz Ihren Entwurfsprozess unterstützen kann.

Mein Ansatz entspricht Ihrem Kommentar zu IPC (Interprozesskommunikation).

Als Hintergrund studiere ich zunächst das Buch "Networked Graphics" von Steed und Oliveira. Dies bietet einen guten Hintergrund für verschiedene Netzwerkarchitekturen für Spiele, die von verschiedenen Kriterien und Spieltypen abhängen. Es bietet ein Tool, mit dessen Hilfe Sie Ihre Spielarchitektur festlegen und festlegen können, was genau Sie in das Netzwerk einbinden möchten und was lokal erfolgen soll.

Zweitens: Trennen Sie die Netzwerkkomponenten in einen separaten Hintergrund-Thread, damit die Komponente bei Ihrer ersten Spieleentwicklung lokal codiert werden kann. Sie müssen sich jedoch mit der Thread-Trennung befassen. Kombinieren Sie sie nicht mit anderen Funktionen, die später "lokaler Hintergrund" sein werden, sondern zwingen Sie sie in "potenziell entfernte" Hintergrundthreads.

Dies sollte Ihnen helfen, Ihre Logik getrennt zu halten, und Sie können auch Netzwerkverzögerungsfaktoren in den Prozess einbinden, damit Sie auch die Auswirkungen der Latenz sehen können.

Joe Van Steen
quelle
Ich schätze, ich muss das Buch dann überprüfen! Es klingt vielversprechend, in der Lage zu sein, das zu tun, was Sie gesagt haben.
Ghork
@Ghork: Der Schlüssel liegt darin, Ihre Architektur herauszufinden, was Sie lokal und was Sie auf einem Server wollen. oder wie Sie möchten, dass Gleichaltrige kommunizieren und interagieren. Das Buch sollte helfen. Stellen Sie dann alles, was Sie möchten, über einen Client-Server-Code auf die andere Seite eines IPC-Nachrichtenaufrufs, der (vorerst) lokal bleibt, aber "Remote" -Stoff in getrennten Threads aufbewahrt. Fügen Sie in der IPC-Message-Passing-Komponente künstlich die zu simulierende Latenz hinzu. Viel Glück!
Joe Van Steen
1

Wenn Sie mit all diesen Dingen vertraut sind, schreiben Sie doch eine einfache Einzelspieler-Version 1, und wenn dies funktioniert, überdenken Sie mit Ihrem tieferen Wissen die Sache für Version 2, die für mehrere Spieler gedacht ist, gründlich.

Etienne Charland
quelle
0

Implementieren Sie eine "falsche Netzwerk" -Klasse, die Nachrichten zwischen Threads weiterleitet und dieselbe Schnittstelle wie die Netzwerkklasse hat. Später können Sie das falsche Netzwerk ausarbeiten, um zufällige Verzögerungen und Paketverluste zu vermeiden. Es wird immer einfacher sein, Netzwerkcode mit der gefälschten Klasse zu debuggen als mit dem realen Netzwerk.

ddyer
quelle