Jak powinienem śledzić pozycje graczy w czasie rzeczywistym w MMO?

14

Jak śledzisz pozycje graczy w MMORPG? Przeczytałem, że możesz użyć bazy danych lub zapisać współrzędne w plikach. Próbowałem użyć bazy danych, ale było to powolne. Jak można wykorzystać pliki do śledzenia pozycji graczy?

Baccari
źródło

Odpowiedzi:

23

Jak można wykorzystać pliki do śledzenia pozycji graczy?

Zapisujesz pozycję odtwarzacza w pliku. Na przykład, jeśli zidentyfikujesz każdego odtwarzacza za pomocą unikalnego numeru (lub identyfikatora GUID), możesz użyć go jako nazwy pliku. W pliku po prostu zapisz dane pozycji w formacie, który możesz później przeanalizować. 467239.txtMoże na przykład zawierać, 20, 3, 19jeśli odtwarzacz # 467239 znajduje się w tej lokalizacji ( x, y, z ).

Nie różni się to jednak od tego, co zrobiłbyś z bazą danych - baza danych nie powinna być „powolna” w tej operacji, powinna być bardzo szybka (prawdopodobnie szybsza niż pliki, ponieważ masz więcej narzutów na dysku IO lub blokowanie IO rywalizacja - jeśli zapisałeś wiele pozycji na plik - w podejściu opartym na systemie plików).

Być może próbowałeś użyć DB lub systemu plików do przechowywania pozycji odtwarzacza w czasie wykonywania ? W ogóle nie powinieneś tego robić .

W czasie wykonywania, na twoim serwerze, pozycje graczy powinny być przechowywane w pamięci i tam aktualizowane, tak jak w przypadku każdej innej gry. Okresowo można je zapisywać na dysku lub innym trwałym nośniku - na przykład, gdy odtwarzacz odpoczywa, zapisuje lub wylogowuje się.

Ale zapisywanie każdej pozycji gracza do przechowywania każdej aktualizacji jest niepotrzebne i wyjątkowo nieefektywne; nigdy nie będzie wystarczająco szybki, aby poradzić sobie z czymkolwiek przypominającym „masywną” skalę gracza.


źródło
1
Tak, tak naprawdę zapisywałem pozycję gracza na postgreSQL w czasie wykonywania. Ale jeśli zachowam to w pamięci serwera, jak mogę zaktualizować pozycję w klientach?
Baccari,
12
Metoda, za pomocą której klient jest aktualizowany, jest taka sama we wszystkich przypadkach: serwer informuje klienta o swojej pozycji za pomocą komunikatu sieciowego (lub bardziej realistycznie, klient, który dokonuje lokalnej prognozy, ma również pozycję lokalną, która: serwer sprawdza i potwierdza dla klienta). Nie powinieneś mieć dostępu klienta do bazy danych, do której serwer ma dostęp.
1
Tęsknię za tym, aby powiedzieć „zrób to z plikiem”, tylko po to, aby wyjaśnić, że w rzeczywistości jest gorsze niż używanie db, a następnie wyjaśnienie, który jest prawdziwym problemem. Dlaczego potrzebujesz tego bezużytecznego wyjaśnienia pliku? To tylko myli zwykłego czytelnika, który nie przynosi korzyści nikomu.
o0 ”.
6
W przeszłości miałem doświadczenie, że ignorowanie bezpośrednich pytań i po prostu wygłaszanie wykładu na temat tego, co moim zdaniem „właściwą drogą” powinno być bardziej konfrontacyjne i sprawia, że ​​OP jest mniej podatny na odwodzenie od słabszych podstaw - ich pierwotne pytanie brzmi: pochodzących z, to wszystko.
13

Pozycja musi znajdować się w pamięci RAM podczas używania. (np. postać gracza znajduje się na świecie) Nie możesz używać DB jako pamięci operacyjnej. Cóż, możesz, ale to będzie okropne.

Powinieneś zapisywać pozycje regularnie, ale nie za każdym razem, gdy się zmieniają.

Unikałbym również zapisywania wszystkich pozycji jednocześnie. Jeśli chcesz zachować trwałość w przypadku awarii serwera, powinieneś zapisywać pozycję tak często, jak to możliwe, ale w wolnym czasie gry. Po prostu zrób to partiami.

Zaoszczędź 30 pozycji, gdy dostępny jest wolny czas.

Co do klientów. Powinny one otrzymywać (odpowiednie) aktualizacje stanu gry poprzez połączenie z oprogramowaniem serwera. Nie z DB ... To byłoby niepraktyczne, powolne, złe, złe i siła byłaby zakłócona.

Kojot
źródło
2
I tak, użyj osobnego wątku, aby uniknąć sytuacji, w których baza danych mogłaby zablokować resztę pętli gry.
Coyote
4

Mam osobny wątek, który umieszczam w kolejce, aby zapisywać w plikach co około 500 gier. W przeciwnym razie powinieneś przechowywać wszystko w pamięci RAM.

Ian Macalinao
źródło
4

Na moim serwerze zapisuję kierunek gracza (wektor) i ostatnią pozycję, jeśli gracz ma prędkość, obliczam nową pozycję gracza co 2 sekundy.

Klient ma oczywiście swoją własną pozycję i wysyła nowy kierunek (wektor) na serwer.

Serwer ma autorytatywną pozycję i wysyła pakiet pozycji, jeśli klient przesunął się o określoną odległość od ostatniego sprawdzenia (może to prowadzić do efektu gumki, jeśli klient nie jest zsynchronizowany).

Wszystko to dzieje się oczywiście w pamięci.

Christian Flodihn
źródło