Jaka jest korzyść z wydajności zapisywania wszystkich zalogowanych znaków w MMO w regularnych odstępach czasu?


26

Większość MMORPGS ma system Worldsave, który zapisuje wszystkie postacie raz na X godzin. Myślę, że powodem jest wydajność. Dlaczego więc jest to lepsze pod względem wydajności niż oszczędzanie postaci po rozłączeniu?


34
To nie jest wydajność; poświęca trochę wydajności dla poprawności , co jest ważniejsze.
Mason Wheeler,

Czy czas naprawdę odgrywa tutaj jakąś rolę? AFAIK, każda akcja w mmo jest zapisywana natychmiast. Dostajesz przedmiot, który jest dodawany na serwerze bezzwłocznie na twoje konto, w przeciwnym razie serwer musiałby pamiętać, że to zrobiłeś, a następnie zrobić to 5 minut później, co nie przynosi żadnych korzyści. Albo klient musiałby zapamiętać i wysłać go 5 minut później, co teraz otwiera cię na hakowanie, ponieważ w ciągu tych 5 minut każdy może zmienić / dodać dane, które mają zostać wysłane.
Mam nadzieję, że będzie

4
@HopefullyHelpful Nie, to nie jest prawda. Każda akcja w MMO jest natychmiast zapamiętywana , ale jest to przemijające. Zapisywanie wszystkiego bezpośrednio w trwałym magazynie jest wciąż zbyt drogie, nawet w przypadku dysków SSD. Nawet w przypadku gier, które zapisują bezpośrednio w bazie danych, sama baza danych nie zapisuje natychmiast tych danych na dysku (lub przynajmniej zapisuje tylko dziennik transakcji, a nie spójne dane - należy to przebudować w razie awarii i zajmuje sporo czasu trochę czasu). Ale oszczędzanie na rozłączeniu jest złym pomysłem z innego powodu - spójności.
Luaan,

1
Myślałem, że to pytanie będzie bardziej zgodne z korzyściami wynikającymi z oszczędzania postaci w odstępach czasu w czasie rzeczywistym.
Anthony

2
@Luaan: Zupełnie możliwe jest zapisanie każdej zmiany stanu w pamięci trwałej, nawet na mechanicznych dyskach twardych. (Możesz potrzebować kilku na zajętych serwerach). Sztuka polega na tym, aby nie aktualizować poszczególnych obiektów. Zamiast tego zapisujesz dziennik transakcji "Gracz (A). Inwentaryzacja + = Obiekt (B)`. Okresowo opróżniasz pełny stan. Aby odzyskać, ponownie ładujesz ostatni pełny zapis i stosujesz najnowsze transakcje z dziennika transakcji. Ponieważ 'piszę jeden plik sekwencyjnie, osiągasz najwyższą wydajność mechanicznych dysków twardych. Ale aby zachować rozsądny rozmiar dziennika transakcji, potrzebujesz okresowych pełnych zapisów.
MSalters

Odpowiedzi:


66

To nie jest wydajność. To jest bezpieczne. Jeśli świat oszczędza co kilka minut, to jeśli coś stanie się z serwerem i wyłączy się, wszyscy stracą tylko kilka minut postępu.

Oszczędzając przy rozłączeniu, jeśli serwer ma problem, wszyscy stracą wszystko, co zrobili od momentu zalogowania. Osoby biorące udział w szczególnie długich sesjach gry (jak to często bywa w grach MMO) tracą znaczną ilość danych.

Poświęcają trochę wydajności, aby wyeliminować ryzyko utraty danych.

Oczywiście można łatwo przechowywać dane odtwarzacza na komputerach klienckich, zmniejszając ruch w sieci. Problem polega na tym, że jest on otwarty na hakowanie. Gdy jedna osoba nauczy się oszukiwać, dzieli się nią i wszyscy to robią.


EDYCJA: Jak wskazał @Philipp , usuwa to również możliwość duplikowania elementów. W przypadku systemu zapisywania przy rozłączaniu, jeśli transakcja jest przeprowadzana przed awarią serwera, a jedna osoba wylogowuje się przed awarią, obaj gracze są przywracani do ostatniego wylogowania, usuwając lub duplikując elementy.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Josh

5

Wczesne systemy, które zapisywały tylko przy rozłączeniu, miały tendencję do okresowego zapisywania, gdy odtwarzacz był aktywny. W tych systemach, zazwyczaj MUD (dungeon wielu użytkowników), postać była utrzymywana w pamięci, dopóki nie były okresowo zrzucane do pliku.

Oznaczało to, że jeśli użytkownik rozłączył się bez „biwakowania”, zwykle znajdował się w odległości kilku pokoi i brakowało mu kilku łupów, XP itp. Od ostatniego zapisania. Pod tym względem zachowywał się bardzo podobnie do dzisiejszych gier RPG na konsole (musisz zapisać swoją grę bez wyłączania konsoli, inaczej stracisz wszystko od ostatniego zapisania).

System działał zgodnie ze swoim przeznaczeniem, ponieważ postacie nie mogły ze sobą współdziałać, chyba że za pośrednictwem systemu „mailowego”, w którym mogły wysyłać do siebie wiadomości i elementy. Szanse na utratę przedmiotów i postępy były dość znaczące, ale w większości przypadków dotyczyły one tylko jednej postaci na raz.

Funkcja oszczędzania świata pojawiła się, ponieważ postacie ostatecznie mogły bezpośrednio ze sobą współdziałać, więc wszystkie grające postacie musiały być w spójnym stanie, w przeciwnym razie może nastąpić powielanie i usuwanie przedmiotów. Nie było to problemem w scenariuszu MUD, ponieważ trudno było nadużyć systemu w sposób, który spowodował duplikację przedmiotów lub walut, ale było to niezwykle łatwe we wczesnych MMO MUD. Gracz A daje graczowi B przedmiot, gracz B zapisuje, a gracz A rozłącza się bez zapisywania. Natychmiastowe powielanie.

Worldsave nie jest korzyścią dla wydajności, ale ma na celu zapobieganie oszustwom. Pamiętam grę na systemach, na których wydarzenie worldsave zostało dosłownie ogłoszone z wyprzedzeniem i często zawieszałem cały system na minutę, podczas gdy serwer aktualizował wszystkie swoje pliki. Chociaż zapobiegało to oszustwom, nie było to zbyt wygodne dla użytkowników tych systemów.

To prowadzi nas do obecnego stanu rzeczy. Dziś nie używamy funkcji typu worldsave. Korzystamy z baz danych. To pozwala nam upewnić się, że kopiowanie i usuwanie jest zminimalizowane w jak największym stopniu. Znaki istnieją jako rekordy w bazie danych, a każda transakcja między graczami jest dosłowną transakcją w bazie danych; akcja jest w pełni zatwierdzona lub zostanie wycofana.

Pomijając nietypowe błędy w systemie, zyskujesz korzyści z zapisywania pojedynczych plików postaci (szybki czas zapisywania) i korzyści oszczędzania światów (bez oszustw), bez wad jednego z nich (utrata znacznego postępu i powielania przedmiotów).

Projektując nowoczesną grę MMO, chciałbyś utworzyć procedury składowane w bazie danych i używać tych procedur do wykonywania transakcji. Na przykład podczas wymiany między dwoma graczami może to wyglądać następująco:

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;

(Uwaga: ten SQL nie jest napisany w praktyczny sposób i ma jedynie stanowić przykład).

W ten sposób, jeśli nastąpi awaria przed zatwierdzeniem, system powraca do stanu, w którym gracz 111 i gracz 333 nadal mają oryginalne przedmioty, a po zatwierdzeniu handel jest zakończony. Nie ma możliwości powielania, ponieważ postacie są zapisywane w tym samym czasie, co gwarantuje baza danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.