Wie soll ich die Echtzeitpositionen der Spieler in einem MMO verfolgen?
14
Wie verfolgst du die Positionen der Spieler in einem MMORPG? Ich habe gelesen, dass Sie entweder eine Datenbank verwenden oder die Koordinaten in Dateien speichern können. Ich habe versucht, eine Datenbank zu verwenden, aber sie war langsam. Wie können Dateien verwendet werden, um die Positionen der Spieler zu verfolgen?
Wie können Dateien verwendet werden, um die Positionen der Spieler zu verfolgen?
Sie schreiben die Playerposition in die Datei. Wenn Sie beispielsweise jeden Player mit einer eindeutigen Nummer (oder einer GUID) identifizieren, können Sie diese als Dateinamen verwenden. Schreiben Sie in die Datei einfach die Positionsdaten in einem Format, das Sie später analysieren können. Zum Beispiel 467239.txtkönnte enthalten, 20, 3, 19wenn Spieler # 467239 an dieser ( x, y, z ) Position ist.
Dies unterscheidet sich jedoch nicht von dem, was Sie mit einer Datenbank tun würden - eine Datenbank sollte bei diesem Vorgang nicht "langsam" sein, sie sollte sehr schnell sein (wahrscheinlich schneller als Dateien, da Sie mehr Festplatten-E / A-Overhead oder E / A-Sperren haben) Konflikt - wenn Sie mehrere Positionen pro Datei gespeichert haben - in einem dateisystembasierten Ansatz).
Vielleicht haben Sie versucht, die Position des Players zur Laufzeit mithilfe der Datenbank oder des Dateisystems zu speichern ? Sie sollten dies überhaupt nicht tun .
Zur Laufzeit sollten auf Ihrem Server die Positionen der Spieler gespeichert und dort aktualisiert werden, wie bei jeder anderen Art von Spiel. Sie können regelmäßig auf der Festplatte oder in einem anderen dauerhaften Speicher gespeichert werden, z. B. wenn der Player inaktiv ist, sich speichert oder sich abmeldet.
Es ist jedoch unnötig und äußerst ineffizient, die Position jedes Spielers in die Speicherung jedes Updates zu schreiben. Es wird niemals schnell genug sein, um mit etwas fertig zu werden, das einer "massiven" Spielerskala ähnelt.
Ja, tatsächlich habe ich die Player-Position zur Laufzeit auf einem PostgreSQL-Server gespeichert. Aber wie kann ich die Position in den Clients aktualisieren, wenn ich sie im Serverspeicher belasse?
Baccari
12
Die Methode, mit der der Client aktualisiert wird, ist in allen Fällen die gleiche: Der Server teilt dem Client über eine Netzwerknachricht seine Position mit (oder realistischer gesagt, der Client, der eine lokale Vorhersage vornimmt, hat auch eine lokale Position, die seine Position angibt der Server validiert und bestätigt für den Client). Ihr Client sollte nicht auf die Datenbank zugreifen, auf die der Server zugreift.
1
Ich vermisse den Punkt, zu sagen "mach es mit einer Datei", nur um zu erklären, dass es tatsächlich schlimmer ist, als die DB zu verwenden und dann zu erklären, welches das eigentliche Problem ist. Warum brauchen Sie diese nutzlose Dateierklärung überhaupt? Es verwirrt nur den Gelegenheitsleser, was für niemanden von Vorteil ist.
o0 '.
6
Es war meine Erfahrung in der Vergangenheit, dass das Ignorieren direkter Fragen und das bloße Vorlesen darüber, was meiner Meinung nach "der richtige Weg" sein sollte, eher zu Konfrontationen führt und das OP weniger empfänglich dafür macht, von der schwächeren Grundlage weggeführt zu werden kommt von, das ist alles.
13
Die Position muss sich während der Verwendung im RAM befinden. (Beispiel: Der Charakter des Spielers ist in der Welt) Sie können den DB nicht als Arbeitsspeicher verwenden. Das kannst du, aber das wird schrecklich.
Sie sollten die Positionen regelmäßig speichern, jedoch nicht bei jedem Wechsel.
Ich würde auch vermeiden, alle Positionen gleichzeitig zu speichern. Wenn Sie im Falle eines Serverausfalls die Ausdauer beibehalten möchten, sollten Sie die Position so oft wie möglich, jedoch in der Freizeit des Spiels speichern. Tun Sie dies einfach nach Chargen.
Speichern Sie 30 Positionen, solange noch Zeit zur Verfügung steht.
Wie für die Kunden. Sie sollten (relevante) Spielstatus-Updates über eine Verbindung zu Ihrer Serversoftware erhalten. Nicht von der DB ... Das wäre unpraktisch, langsam, böse, böse und die Macht würde gestört.
Und ja, verwenden Sie einen separaten Thread, um Situationen zu vermeiden, in denen die Datenbank den Rest Ihrer Spieleschleife blockiert.
Coyote
4
Ich habe einen separaten Thread in der Warteschlange, in dem ich alle 500 oder mehr Spiel-Ticks in Dateien speichere. Andernfalls sollten Sie alles im RAM speichern.
Was ich auf meinem Server mache, ist, die Richtung (Vektor) und die letzte Position des Spielers zu speichern. Wenn der Spieler eine Geschwindigkeit hat, berechne ich alle 2 Sekunden die neue Position des Spielers.
Der Client hat natürlich eine eigene Positionsposition und sendet diese neu (Vektor) an den Server.
Der Server ist für die Position maßgeblich und sendet ein Positionspaket, wenn sich der Client seit der letzten Überprüfung um eine bestimmte Strecke bewegt hat (dies kann zu einem Gummibandeffekt führen, wenn der Client nicht synchron ist).
Die Position muss sich während der Verwendung im RAM befinden. (Beispiel: Der Charakter des Spielers ist in der Welt) Sie können den DB nicht als Arbeitsspeicher verwenden. Das kannst du, aber das wird schrecklich.
Sie sollten die Positionen regelmäßig speichern, jedoch nicht bei jedem Wechsel.
Ich würde auch vermeiden, alle Positionen gleichzeitig zu speichern. Wenn Sie im Falle eines Serverausfalls die Ausdauer beibehalten möchten, sollten Sie die Position so oft wie möglich, jedoch in der Freizeit des Spiels speichern. Tun Sie dies einfach nach Chargen.
Speichern Sie 30 Positionen, solange noch Zeit zur Verfügung steht.
Wie für die Kunden. Sie sollten (relevante) Spielstatus-Updates über eine Verbindung zu Ihrer Serversoftware erhalten. Nicht von der DB ... Das wäre unpraktisch, langsam, böse, böse und die Macht würde gestört.
quelle
Ich habe einen separaten Thread in der Warteschlange, in dem ich alle 500 oder mehr Spiel-Ticks in Dateien speichere. Andernfalls sollten Sie alles im RAM speichern.
quelle
Was ich auf meinem Server mache, ist, die Richtung (Vektor) und die letzte Position des Spielers zu speichern. Wenn der Spieler eine Geschwindigkeit hat, berechne ich alle 2 Sekunden die neue Position des Spielers.
Der Client hat natürlich eine eigene Positionsposition und sendet diese neu (Vektor) an den Server.
Der Server ist für die Position maßgeblich und sendet ein Positionspaket, wenn sich der Client seit der letzten Überprüfung um eine bestimmte Strecke bewegt hat (dies kann zu einem Gummibandeffekt führen, wenn der Client nicht synchron ist).
All dies geschieht natürlich in Erinnerung.
quelle