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?
źródło
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?
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.txt
Może na przykład zawierać, 20, 3, 19
jeś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.
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.
źródło
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.
źródło
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.
źródło