W grach online ludzie wolą się logować i wylogowywać, kiedy chcą. Zazwyczaj ich osiągnięcia w grze są bezproblemowo zapisywane na serwerze. Nie jest to trudne do osiągnięcia, ale zastanawiam się, jak można to zrobić w efektywny sposób, który ma sens i daje się skalować.
Czy ma sens zapisywanie współrzędnych gracza i podawanie go za każdym razem, gdy go wysyła? Mój serwer node.js może to zrobić łatwo bez blokowania odpowiedzi i chcę zastosować bazę danych Mongo, ale może bardziej odpowiednie jest to zrobić raz na sekundę, aw przypadku całego serwera, zbierając wszystko naraz?
Odpowiedzi:
Mam na myśli tradycyjną grę MMORPG, taką jak World of Warcraft.
Oszczędzaj po każdym poleceniu każdego gracza i autonomicznej rzeczy (np. NPC)
Zapisuj wszystko okresowo
Zapisz postać podczas wylogowania (nie zapisuj niczego innego)
Zamykanie myśli
Wreszcie, nie traktuj tej rady jako absolutnej prawdy. Nie napisałem systemu tworzenia kopii zapasowych dla wielu graczy. Pracuję nad „grą” online, dlatego właśnie o tym pomyślałem i napisałem swoje przemyślenia powyżej, ale nie doszedłem jeszcze do etapu implementacji tego. Jest to napisane bez faktycznego doświadczenia, ale po wielu lekturach i zebraniu wiedzy na ten temat.
źródło
Podejrzewam, że zależy to od rodzaju gry i ilości ruchu między graczami a serwerem.
W MMORPG nie ma sensu zapisywanie pozycji graczy za każdym razem, gdy wysyłają informacje do serwera. Bardziej sensowne byłoby aktualizowanie, jeśli bieżące dane odtwarzacza są „nieaktualne”, że tak powiem. Korzystne może być również uratowanie stanu gracza podczas ważnych wydarzeń, takich jak wejście na nowe terytorium, pokonanie bossa lub opuszczenie sklepu.
W grze turowej zdecydowanie warto zapisać stan gracza za każdym razem, gdy kończy swoją turę, a także po turze przeciwnika (oszczędzając utratę zdrowia, efekty zaklęć itp.).
Ponownie, odpowiedź zależy całkowicie od skali i możliwości twojego serwera. Chodzi o znalezienie najlepszej równowagi i optymalizację w jak największym stopniu bez utraty jakości.
źródło
Jeśli Twoim jedynym zmartwieniem jest to, kiedy się wylogowują, wówczas jedną prostą odpowiedzią jest zapisanie ich pozycji, gdy wystąpią jakiekolwiek warunki dla nich, które już nie istnieją w świecie gry (z powodu wylogowania lub rozłączenia).
Z drugiej strony, byłbym nieco ostrożny wobec klienta zgłaszającego serwerowi swoją pozycję, a przynajmniej bez jakiejkolwiek formy kontroli poczytalności po stronie serwera. Jeśli już to masz, możesz prawdopodobnie zapisać tę pozycję po wylogowaniu lub rozłączeniu, ponieważ nie musisz się martwić o bezpośrednie pobieranie danych od klienta.
źródło