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.
Antworten:
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 wirdExecuteMove()
.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.
quelle
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.
quelle
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.
quelle
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.
quelle