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?
networking
mmo
databases
bunden
źródło
źródło
Odpowiedzi:
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.
źródło
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:
(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.
źródło