Skuteczne rozwiązanie do podziału przestrzeni w trybie wieloosobowym?

10

To pytanie jest trochę trudne, ale postaram się wyjaśnić.

Powiedzmy, że tworzę grę online (nie w skali MMO), ale która obsługuje jak najwięcej graczy, w sposób autorytatywny. Chcę naprawdę dużych światów z dużą ilością symulowanych wrogów AI.

Jestem świadomy kilku strategii oszczędzania procesora serwera, dzieląc przestrzeń i nie przetwarzając tego, co nie wymaga przetwarzania. Już podzieliłem świat na regiony, które będą wymagały czasu ładowania i małych przejść, co moim zdaniem jest ważne, aby utrzymać jakość gry podczas gry lokalnej (samemu lub nawet z kilkoma przyjaciółmi). Nie oczekuję, że gracze będą w więcej niż jednym lub dwóch regionach.

Problem polega na tym, że region może stać się całkiem duży i jednocześnie symulować wielu NPC. Jak sobie z tym poradzić bez wpływu na doświadczenie graczy? Podejścia takie jak jeden serwer na region i podobne nie są w tabeli.

Szukam głównie struktur danych do przechowywania hord wrogów, a nawet pokojowych NPC. Aby zakończyć pytanie, należy pamiętać, że istnieją pojazdy, dlatego ich podróżowanie w obrębie regionu jest bardzo szybkie, co wpływa na to, kiedy „zabić” obszary.

Grimshaw
źródło
Czy jesteś ograniczony tylko do jednego serwera fizycznego?
Patrick Hughes
Ostatecznie nie. Ale ze względu zarówno na prostotę, jak i osiągalność, na razie nie mogę jeszcze bardziej skomplikować projektu :)
Grimshaw,
Zacznij prosto. Coś w rodzaju WoW, które działa na wielu fizycznych skrzynkach na „serwer”, dzieli swój świat na siatkę, a wszystkie aktualizacje są oparte na tym, kto jest w tych samych skrzynkach co ty. Bardzo prosty, łatwy do ulepszenia, działa dobrze i można go używać tylko z jednym urządzeniem do kontrolowania przetwarzania.
Patrick Hughes
W pełni zgadzam się z twoim punktem widzenia i być może coś mi umknęło w pytaniu. Co jeśli jeden gracz znajduje się po prawej stronie komórki pudełka, a drugi po lewej stronie prawej komórki sąsiada? Powinni się zobaczyć! Świat nadal szuka gry takiej jak WoW. Nie rozumiem tego, jak stworzyć ciągłą siatkę świata, utrzymując ją przy tym? Z pewnością zdarzają się sytuacje, w których gracze z dwóch „serwerów” powinni się zobaczyć :)
Grimshaw,
1
I tak, jeśli chcesz mieć zarówno dużo rzeczy na całym, jak i wielu graczy na całym świecie, naprawdę musisz zaplanować, aby wszystko było aktywne wszędzie i przez cały czas, nie ma magicznej drogi. Dlatego pojedyncze pudełka z grupy serwerów MMO obsługują maksymalnie 200-500 graczy ORAZ dlaczego AI MMO dla NPC jest żałośnie głupie (inaczej tanie w obliczeniach).
Patrick Hughes

Odpowiedzi:

5

Z tego, co rozumiem, będziesz mieć jakąś fizykę działającą na twoim serwerze.

W takim przypadku istnieją również inne techniki sztucznej inteligencji / fizyki inne niż podział przestrzeni kosmicznej. Od większości do mniej oczywistych:

  • priorytet: NPC bez bezpośredniej interakcji z graczami mogą otrzymać mniej czasu procesora przez obniżenie częstotliwości odświeżania. Można używać kolejek priorytetowych i uruchamiać kolejki o wyższym priorytecie od pierwszego do ostatniego, podczas gdy inne kolejki będą uruchamiać tylko 1/2, 1/4 lub 1/8 kolejki w każdym cyklu. w ten sposób upewniasz się, że każdy obiekt działa w pewnym momencie, ale zmniejszasz ilość czasu, w którym zużywa procesor.
  • fizykę można również obniżyć (podczas wędrówki i poza zasięgiem wzroku można używać tylko skrzynek kolizyjnych i kul).
  • uproszczenie sztucznej inteligencji / symulacji poprzez przydzielenie bardzo podstawowych zachowań NPC i środowisku, gdy gracze są daleko. Zwykle będzie wędrować lub skanować wrogów, zamiast polować, zbierać, hodować ...
  • część fizyki i sztucznej inteligencji można również przekazać klientom. Jeśli naprawdę brakuje procesora na serwerach, można oznaczyć obiekt jako częściowo rozwiązany, a klienci dostosują fizykę i położenie tych obiektów lokalnie (aby uniknąć swobodnych NPC). Klientom można przypisać pewną odpowiedzialność za uruchamianie sztucznej inteligencji (podczas walki z graczem urządzenie gracza, na którym działa cel, może bezpośrednio sterować atakującymi NPC)
  • dla graczy fizyka może być również obniżona na serwerze, a klienci otrzymają większą odpowiedzialność za rozwiązywanie kolizji. Np .: trafiłeś obiekt w pojazd, serwer rozwiąże kolizję tylko na polach kolizji i oznaczy obiekty jako potencjalnie kolizyjne. Klient prześle rozdzielczość do serwera ze znacznikiem czasu, który zaakceptuje ją, jeśli obiekty zostaną oznaczone, a rozwiązanie wydaje się prawidłowe.

Po wdrożeniu tych mechanizmów możesz zdecydować, ile i jak często ich potrzebujesz. Wspaniałą rzeczą jest to, że później możesz dodać kilka serwerów, które będą mogły przejąć niektóre zadania zamiast aplikacji klienckich.

Oczywiście przybliżone wykrywanie kolizji spowoduje pewne aberracje, ale będziesz w stanie je rozwiązać, dodając od czasu do czasu większą precyzję.

Także jeśli chodzi o fizykę, powinieneś rzucić okiem na biblioteki lib, które obsługują jakiś system GPGPU, taki jak OpenCL lub CUDA, jeśli masz dostęp do serwera, który obsługuje którykolwiek z nich.

Kojot
źródło
Łączenie podziału przestrzennego regionu z priorytetowymi aktualizacjami powinno być dokładnie tym, czego potrzebuję, optymalnym dla niewielkiej liczby graczy i wciąż zoptymalizowanym, gdy załadowanych zostanie wiele obszarów. Dzięki.
Grimshaw,
@DevilWithin To powinno pomóc i nie wymaga żadnych zmian po stronie klienta. Dodałem także kilka dodatkowych szczegółów do odpowiedzi.
Coyote
Uproszczona sztuczna inteligencja to wspaniały pomysł. Chociaż NPC są daleko od graczy, w większości przypadków nie muszą robić nic oprócz ruchu. Oznacza to, że mogę zrobić przybliżenie tego, co zamierzają, co minutę lub coś takiego, tylko po to, aby wędrowali po całym świecie .. wyobrażając sobie ich jako zombie, zrobiliby to!
Grimshaw,