Was ist der Leistungsvorteil, wenn alle angemeldeten Zeichen in regelmäßigen Abständen in MMOs gespeichert werden?


26

Die meisten MMORPGs haben ein Worldsave-System, das alle X Stunden alle Zeichen speichert. Ich denke, der Grund ist die Leistung. Warum ist dies in Bezug auf die Leistung besser als das Speichern eines Zeichens beim Trennen der Verbindung?


34
Es ist nicht für die Leistung; Es ist ein bisschen Leistung für die Korrektheit zu opfern , was wichtiger ist.
Mason Wheeler

Spielt Zeit hier wirklich eine Rolle? AFAIK, jede Aktion in einem MMO wird sofort gespeichert. Sie erhalten einen Artikel und dieser Artikel wird Ihrem Konto unverzüglich auf dem Server hinzugefügt. Andernfalls müsste der Server daran denken, dass Sie dies getan haben, und es dann 5 Minuten später tun, was keinen Vorteil hat. Oder der Client müsste sich daran erinnern und es 5 Minuten später senden, was Sie nun zum Hacken öffnet, da in diesen 5 Minuten jeder die zu sendenden Daten ändern / hinzufügen kann.
Hoffentlich

4
@HopefullyHelpful Nein, das stimmt nicht. Jede Aktion in einem MMO wird sofort gespeichert , aber das ist vergänglich. Selbst mit SSDs ist es immer noch viel zu teuer, alles direkt im permanenten Speicher zu speichern. Selbst bei Spielen, die direkt in einer Datenbank gespeichert werden, speichert die Datenbank selbst diese Daten nicht sofort auf der Festplatte (oder speichert zumindest nur ein Transaktionsprotokoll, nicht die konsistenten Daten - dies muss bei einem Absturz neu erstellt werden und dauert eine ganze Weile bisschen Zeit). Das Einsparen von Verbindungsabbrüchen ist jedoch aus einem anderen Grund eine schlechte Idee - Konsistenz.
Luaan

1
Ich dachte, diese Frage würde eher dahingehend lauten, was der Leistungsvorteil des Speicherns von Zeichen in Intervallen gegenüber Echtzeit ist.
Anthony

2
@Luaan: Es ist durchaus möglich, jede Statusänderung in einem dauerhaften Speicher zu speichern, auch auf mechanischen Festplatten. (Auf ausgelasteten Servern sind möglicherweise einige erforderlich.) Der Trick besteht darin, einzelne Objekte nicht zu aktualisieren. Stattdessen speichern Sie ein Transaktionsprotokoll "Player (A) .Inventory + = Object (B)". In regelmäßigen Abständen leeren Sie den vollständigen Status. Um wiederherzustellen, laden Sie die letzte vollständige Sicherung erneut und wenden die neuesten Transaktionen aus dem Transaktionsprotokoll an Wenn Sie eine Datei nach der anderen schreiben, erreichen Sie die maximale Leistung für mechanische Festplatten.
Um

Antworten:


66

Dies ist nicht für die Leistung. Dies ist ausfallsicher. Wenn die Welt alle paar Minuten spart, passiert etwas mit dem Server und fährt ihn herunter, verlieren alle nur ein paar Minuten Fortschritt.

Wenn der Server ein Problem hat, verliert jeder Benutzer alles, was er seit seiner Anmeldung getan hat, indem er beim Trennen spart. Bei Spielen mit besonders langer Spieldauer (wie dies bei MMOs üblich ist) gehen erhebliche Datenmengen verloren.

Sie opfern ein wenig Leistung, um das Risiko des Verlusts von Massendaten zu beseitigen.

Natürlich können Sie die Player-Daten problemlos auf den Client-Computern speichern und so den Netzwerkverkehr reduzieren. Das Problem hierbei ist, dass es offen für Hacking ist. Sobald eine Person das Betrügen erarbeitet hat, teilt sie es und jeder tut es.


BEARBEITEN : Wie @Philipp hervorhob , wird dadurch auch die Möglichkeit zum Duplizieren von Elementen aufgehoben . Bei einem System zum Speichern beim Trennen von Verbindungen werden bei einer Transaktion, die vor einem Serverabsturz ausgeführt wird, und bei einer Abmeldung einer Person vor dem Absturz beide Spieler auf den letzten Zeitpunkt zurückgesetzt, bei dem sie sich abgemeldet haben. Dabei werden die Elemente entweder gelöscht oder dupliziert.


Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Josh

5

Frühe Systeme, die nur beim Trennen der Verbindung gespeichert wurden, wurden in der Regel auch regelmäßig gespeichert, während der Player aktiv war. In diesen Systemen, in der Regel MUDs (Multi-User Dungeons), wurde der Charakter so lange im Speicher gehalten, bis er regelmäßig in einer Datei abgelegt wurde.

Dies bedeutete, dass ein Benutzer, der die Verbindung ohne "Zelten" getrennt hatte, in der Regel mehrere Räume entfernt war und beim letzten Speichern eine Menge Beute, EP usw. verpasste. In dieser Hinsicht hat es sich sehr ähnlich verhalten, wie Konsolen-RPGs heute gespielt werden (Sie müssen Ihr Spiel speichern, ohne die Konsole auszuschalten, oder Sie verlieren alles seit dem letzten Speichern).

Das System funktionierte für seinen beabsichtigten Zweck, da Charaktere nicht miteinander interagieren konnten, außer möglicherweise über ein "Mail" -System, in dem sie Nachrichten und Gegenstände aneinander senden konnten. Die Wahrscheinlichkeit, Gegenstände zu verlieren und Fortschritte zu machen, war in der Regel recht hoch, betraf jedoch jeweils nur einen Charakter.

Die Weltsparfunktion entstand, weil die Charaktere schließlich in der Lage waren, direkt miteinander zu interagieren, so dass alle gespielten Charaktere in einem konsistenten Zustand sein mussten, da es sonst zu Duplizierungen und Löschungen von Gegenständen kommen konnte. Dies war im MUD-Szenario kein Problem, da es schwierig war, das System auf eine Weise zu missbrauchen, die zu doppelten Artikeln oder Währungen führte. In frühen MMO-MUDs war dies jedoch unglaublich einfach. Spieler A gibt Spieler B einen Gegenstand, Spieler B speichert und Spieler A trennt die Verbindung, ohne zu speichern. Sofortige Vervielfältigung.

Worldsave ist kein Leistungsvorteil, sondern wurde entwickelt, um Betrug zu verhindern. Ich erinnere mich, dass ich auf Systemen gespielt habe, auf denen das Worldsave-Ereignis buchstäblich im Voraus angekündigt wurde, und oft das gesamte System für eine Minute aufgehängt habe, während der Server alle seine Dateien aktualisiert hat. Dies verhinderte zwar das Betrügen, war jedoch für die Benutzer dieser Systeme nicht sehr bequem.

Das führt uns zum aktuellen Stand der Dinge. Heutzutage verwenden wir keine Worldsave-Type-Funktionen. Wir benutzen Datenbanken. Auf diese Weise können wir sicherstellen, dass Duplikate und Löschvorgänge so weit wie möglich minimiert werden. Die Charaktere existieren als Datensätze in einer Datenbank und jede Transaktion zwischen Spielern ist eine wörtliche Datenbanktransaktion. Entweder ist die Aktion vollständig festgeschrieben oder es wird ein Rollback durchgeführt.

Abgesehen von ungewöhnlichen Fehlern im System erhalten Sie die Vorteile des Speicherns einzelner Zeichendateien (schnelle Speicherzeiten) und die Vorteile der Weltspeicherung (kein Schummeln), ohne die Nachteile von beidem (Verlust erheblicher Fortschritte und Duplizierung von Objekten).

Wenn Sie ein modernes MMO entwerfen, möchten Sie gespeicherte Prozeduren in einer Datenbank erstellen und diese Prozeduren zum Ausführen von Transaktionen verwenden. Wenn Sie beispielsweise zwischen zwei Spielern tauschen, könnte dies so aussehen:

start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;

(Hinweis: Diese SQL ist nicht in praktischer Weise geschrieben und soll nur ein Beispiel sein.)

Auf diese Weise kehrt das System bei einem Absturz vor dem Festschreiben in einen Zustand zurück, in dem Spieler 111 und Spieler 333 noch die ursprünglichen Gegenstände haben, während der Handel nach dem Festschreiben abgeschlossen ist. Es gibt keine Möglichkeit zur Vervielfältigung, da die Zeichen gleichzeitig gespeichert werden, wie dies von der Datenbank garantiert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.