Wie oft wird der Status des Spielers in dauerhaften Online-Spielen gespeichert?

9

In Online-Spielen melden sich Benutzer lieber an und ab, wann immer sie wollen. Normalerweise werden ihre Spielerfolge nahtlos auf dem Server gespeichert. Das ist nicht so schwer zu erreichen, aber ich frage mich, wie es auf effiziente Weise sinnvoll und skalierbar gemacht werden kann.

Ist es sinnvoll, die Koordinaten und den Status des Spielers bei jedem Senden zu speichern? Mein node.js- Server kann dies problemlos tun, ohne eine Antwort zu blockieren, und ich möchte eine Mongo-Datenbank verwenden. Vielleicht ist es jedoch besser, dies einmal pro Sekunde und in einem serverweiten Ereignis zu tun und alles auf einmal zu sammeln.

Lanbo
quelle
Ich speichere den Spielstatus alle 10 Sekunden. Ich denke, das ist genug, es bleibt unbemerkt (und ich verwende meinen MMORPG-Server auf meinem Netbook mit 512 MB RAM).
JCora

Antworten:

10

Ich denke an ein traditionelles MMORPG wie World of Warcraft.

Speichern Sie nach jedem Befehl von jedem Spieler und autonomen Sache (zB NPC)

  • Ständige Sicherung. Der Server kann jederzeit ausfallen, und der Status des Spiels wird bis zu diesem Zeitpunkt gespeichert (oder zumindest so aktuell wie möglich).
  • Auswirkungen auf die Serverleistung; Selbst wenn es nicht blockierend ist (dh auf einem anderen Thread), selbst wenn sich die Datenbank auf einem anderen Server befindet, wird es verarbeitet, was Sie sonst nicht tun würden. Wenn es nicht blockiert, wie Sie sagen, muss ein anderer Thread damit umgehen, und das ist ein Thread, der mit etwas anderem besetzt sein könnte.
  • Erhöhte Festplatten-E / A, wodurch das Risiko / die Ausfallrate erhöht wird. Dies ist besonders dann von Bedeutung, wenn Sie SSDs aufgrund ihrer geringeren Lebensdauer als Speicher verwenden.
  • Wenn Sie die Datenbank auf einen anderen Server auslagern, wird die Bandbreite erhöht. Dies kann ein Problem sein, wenn Sie für die Bandbreite bezahlen und wenn diese nicht auf einer separaten Netzwerkkarte gespeichert ist, werden Ressourcen beansprucht, die besser für die Verarbeitung des Spielerverkehrs geeignet sind.
  • Was passiert, wenn der Server beim Speichern des Status dieser Befehle immer weiter zurückbleibt? Dh wenn mehr Befehle eingehen als gespeichert werden können, stapeln sie sich in einer Warteschlange? Läuft diese Warteschlange über und verursacht sie einen Fehler? Stoppen Sie alles, damit die Warteschlange aufholen kann?
  • Es scheint mir, dass dieser Ansatz, obwohl er einfach klingt, sorgfältig geplant werden müsste. Beispielsweise müssen aufeinanderfolgende Befehle, die aufeinander angewiesen sind, zusammen gespeichert werden. Andernfalls kann ein Fehler in der Mitte der Befehle auftreten, und nur einer wird gespeichert, der andere nicht. Überlegen Sie, ob zwei Spieler einen Trade ausführen und zwei Befehle auf der Festplatte gespeichert werden: "1 des Artikels zum Empfänger hinzufügen" und "1 des Artikels vom Absender subtrahieren". Wenn nach dem ersten Befehl, aber bevor der zweite Befehl gespeichert wird, ein Fehler auftritt, liegt eine Elementduplizierung vor. (Wenn die Reihenfolge umgekehrt ist, haben Sie einen verlorenen Artikel)

Speichern Sie alles regelmäßig

  • Im Falle eines Ausfalls ist der Server etwas veraltet. Hoffentlich verwenden Sie so etwas wie einen journalisierten Ansatz, sodass der letzte Schnappschuss mindestens vollständig und konsistent ist und alle aktiven Spieler um dieselbe Zeitspanne zurückgesetzt werden.
  • Unabhängig davon, welches Datenbanksystem Sie verwenden, ist möglicherweise eine Optimierung für die Stapelaktualisierung möglich, die effizienter ist (weniger Overhead) als die Aktualisierung nacheinander.
  • Wenn Sie sich stattdessen für ein binäres Dateisystem entscheiden, ist diese Methode kinderleicht. Erstellen Sie eine neue Datei, speichern Sie den Speicher und werfen Sie am Ende eine Markierung, die signalisiert, dass die Sicherung vollständig abgeschlossen wurde. Löschen Sie nach Abschluss einer Sicherung die vorherige Sicherung (oder nicht).
  • Der Sicherungsprozess muss möglicherweise auch die im letzten Aufzählungspunkt des anderen Abschnitts genannten Punkte berücksichtigen, z. B. das Speichern in der Folge aufeinanderfolgender Befehle, die nicht unterbrochen werden sollten. Sie können sich dafür entscheiden, den gesamten Datensatz zu sperren, auf die Festplatte zu kopieren und zu entsperren. Je nachdem, wie viel Zeit dies in Anspruch nimmt, kann dies zu einer ziemlich starken Pause oder Verlangsamung des Spiels führen.

Speichern Sie einen Charakter beim Abmelden (speichern Sie nichts anderes)

  • Das Wichtigste für einen Spieler ist sein Charakter, zu dem die Gegenstände gehören, die er erworben hat, die Fähigkeiten, die er erworben hat, seine Freundesliste und so weiter. Wenn sie ein Monster töten und die Beute vor ihnen auf dem Boden liegt und der Server dann ausfällt, werden sie ein wenig gebrochen sein, wenn sie nicht die Chance haben, ihre Beute aufzuheben, aber sie werden darüber hinwegkommen. Speichern Sie also einfach die wichtigen Dinge und schwitzen Sie nicht die kleinen Dinge. Speichern Sie zum Beispiel nicht die Positionen von NPCs. Wenn der Server ausfällt und wieder hochfährt, erscheinen sie in dem allgemeinen Bereich, in dem sie sich befinden sollten. Die Ausnahme bilden natürlich alle "intelligenten" NPCs, die aus irgendeinem Grund an dem Ort bleiben müssen, an dem sie sich befinden waren, als der Server ausfiel.
  • Außerdem sollte ein Spieler nicht zu viele Stunden gleichzeitig angemeldet sein (beachten Sie, dass ich hier erwäge, "in eine Lobby zurückzukehren", um sich abzumelden). Sie müssen schließlich eine Toilettenpause einlegen oder etwas zu essen bekommen oder von ihren Eltern / Freunden / was auch immer unterbrochen werden oder schlafen. Sie sollten also realistisch gesehen nicht länger als beispielsweise 8 Stunden ohne Unterbrechung angemeldet sein, selbst für die Hardcore-Spieler. Wenn ein "Spieler" für einen wirklich langen Zeitraum angemeldet ist, besteht eine gute Chance, dass es sich entweder um mehrere Personen oder um einen Bot handelt und keiner von beiden wünschenswert oder normal ist.
  • Außerdem sollte Ihr Abmeldevorgang bereits nach Dingen wie den oben genannten aufeinander folgenden Befehlen suchen. Es sollte im Wesentlichen bereits den Charakter packen, also ist es offensichtlich die beste Zeit, ihn auf die Festplatte zu kopieren.

Gedanken schließen

  • Natürlich bin ich für den letzten Ansatz, aber ich habe versucht, in allen drei Punkten unvoreingenommen zu sein.
  • Es ist schwer zu sagen, welche der ersten beiden Methoden verschwenderischer ist. Wenn der Charakter bei der ersten Methode mehrere Bewegungsbefehle sendet, werden diese jeweils auf der Festplatte gespeichert und überschrieben, wenn sie eindeutig in einem zusammengefasst werden können. Bei der zweiten Methode werden jedoch die Positionen Ihrer Bevölkerung auf der Festplatte gespeichert, auch wenn sie seit dem letzten Sicherungsvorgang exakt gleich sind. Im dritten Fall ist es sehr wahrscheinlich, dass sich jemand anmeldet und sofort abmeldet, aber meistens haben sich viele Dinge am Player geändert, sodass die Verschwendung so aussieht, als wäre sie minimal.
  • Beachten Sie, dass dies im Falle eines Fehlers ausschließlich zur Sicherung dient und ein Fehler unbedingt minimiert werden sollte. Es ist gut, diesen Ausnahmefall zu behandeln, aber am Ende, wenn der Server ausfällt, gehen einige Daten verloren und einige Spieler werden verärgert sein. Implementieren Sie also einfach jede Methode, die Sie können, was Sie für am einfachsten oder am besten halten, und fahren Sie fort.
  • Verlassen Sie sich nicht auf diese Standardeinstellung. Fügen Sie eine nette Schaltfläche zum Herunterfahren in Ihre Serveranwendung ein, die Verbindungen ordnungsgemäß schließt und alles in die Datenbank schreibt. Verwenden Sie das auf normaler Basis.

Nehmen Sie diesen Rat nicht als absolute Wahrheit. Ich habe kein Multiplayer-Backup-System geschrieben. Ich bin die Arbeit an einem Online „Spiel“, weshalb ich daran gedacht habe , und schrieb meine Gedanken über, aber ich habe nicht auf die Stufe der Umsetzung dieses noch bekommen. Dies wird also ohne tatsächliche Erfahrung geschrieben, aber nach viel Lesen und Sammeln von Wissen über das Thema.

Ricket
quelle
4
Nach meinen persönlichen Beobachtungen verwenden kommerzielle MMOs eine Kombination aus allen dreien. Das Speichern erfolgt nach wichtigen Ereignissen und Aktionen wie dem Töten / Plündern / Handeln von Bossen in regelmäßigen Abständen, um zu verhindern, dass unkritische Aktionen übersehen werden (und um diejenigen, die für längere Zeit angemeldet sind, nicht zu bestrafen) und immer beim Abmelden. Eine einzige Methode reicht im Allgemeinen nicht aus. Fast alle dieser Methoden basieren auf einer zugrunde liegenden Datenbank im SQL-Stil, die transparent gesichert und wiederhergestellt wird, wenn eine Hardwarefehlfunktion vorliegt.
NtscCobalt
@NtscCobalt - Ich war bis "SQL-Datenbank" bei Ihnen. Ist SQL wirklich eine Voraussetzung? Was ist mit NoSQL?
Beatgammit
@tjameson Nun, mein Kommentar wurde geschrieben, bevor ich NoSQL berührt hatte. Ich habe nur versucht zu sagen, dass Sie Ihr eigenes Format nicht rollen sollten, aber ich würde trotzdem SQL empfehlen, da Sie das Schema vorher kennen sollten (oder faul sein und Entity-Key-Value verwenden sollten) und Konsistenz wichtiger ist als das Fähigkeit, diese Daten zu partitionieren. Weitere Informationen finden Sie unter stackoverflow.com/questions/7339374/… .
NtscCobalt
1

Ich nehme an, es hängt von der Art des Spiels und dem Verkehrsaufkommen zwischen den Spielern und dem Server ab.

In einem MMORPG wäre es nicht sinnvoll, die Position des Spielers jedes Mal zu speichern, wenn er die Informationen an den Server sendet. Es wäre sinnvoller zu aktualisieren, wenn die aktuellen Daten des Spielers sozusagen "veraltet" sind. Es kann auch vorteilhaft sein, den Status des Spielers bei wichtigen Ereignissen wie dem Betreten von Neuland, dem Besiegen eines Chefs oder dem Verlassen eines Geschäfts zu retten.

In einem rundenbasierten Spiel wäre es auf jeden Fall sinnvoll, den Status des Spielers jedes Mal zu speichern, wenn er seinen Zug beendet, sowie nach dem Zug eines gegnerischen Spielers (außer Gesundheitsverlust, Zaubereffekten usw.).

Auch hier hängt die Antwort vollständig von der Größe und den Funktionen Ihres Servers ab. Es geht darum, die beste Balance zu finden und so viel wie möglich zu optimieren, ohne die Qualität zu beeinträchtigen.

JMellow
quelle
1

Wenn Ihre einzige Sorge darin besteht, dass sie sich abmelden, besteht eine einfache Antwort darin, ihre Position zu speichern, wenn Bedingungen für sie in der Spielwelt nicht mehr bestehen (aufgrund von Abmelden oder Trennen).

Nebenbei bemerkt, ich wäre etwas vorsichtig, wenn der Client dem Server seine Position meldet, oder zumindest ohne irgendeine Form der serverseitigen Überprüfung der Integrität. Wenn Sie dies jedoch bereits eingerichtet haben, können Sie diese Position wahrscheinlich beim Abmelden oder Trennen der Verbindung speichern, da Sie sich nicht darum kümmern müssen, Daten direkt vom Client abzurufen.

Lunin
quelle
Ja, daher müssen regelmäßig Updates zu Werten wie Position und XP an den Server gesendet werden. Je länger Sie es verlassen, desto fraglicher wird es, ob der Spieler tatsächlich die gemeldeten Deltas gesammelt hat oder nicht. Wenn Sie diese "Check-in" -Zeiträume einschränken, ist die Überwachung / Steuerung viel einfacher.
Ingenieur
Das Problem zu sagen, wann genau sich ein Spieler in einem lang laufenden Browsergame abgemeldet hat, ist eigentlich kein triviales.
Lanbo
Ich bin damit einverstanden, dass es nicht trivial ist, aber es ist ein Problem, das Sie in den meisten Spielen auf die eine oder andere Weise angehen müssen, auch wenn Sie nur entscheiden, wann ihr Avatar nicht mehr angezeigt wird. Sobald dies erledigt ist, sollte es relativ einfach sein, sich in dieses Szenario einzuklinken und ihre letzte gültige Position zu speichern.
Lunin