Dobry sposób na obsługę sztucznej inteligencji poza ekranem?

16

Na przykład:

  • Powiedzmy, że na świecie jest 10 pokoi.
  • Powiedzmy, że świat zamieszkuje 10 bytów.
  • I każda istota ma swoją „codzienną rutynę”, w której wykonuje określone czynności w pokoju, a także może nawigować między pokojami.

Biorąc pod uwagę, że gracz może znajdować się tylko w jednym pokoju na raz, co jest dobrym sposobem na śledzenie działań, które inne podmioty wykonują w innych pokojach poza ekranem?

  1. Najprostszą opcją jest sprawdzenie każdego z 10 podmiotów w każdej ramce, sprawdzenie ich pozycji / stanu i ustalenie, czy podmiot powinien znajdować się w pokoju, w którym znajduje się gracz w danym momencie. (To jednak wydaje się naprawdę duże zasoby, szczególnie gdy zwiększa się ilość pokoju / obiektu).
  2. Inną opcją jest śledzenie czasu, który upłynął od początku gry, a następnie każdy z podmiotów sprawdza, czy jego wzór przecina się z pokojem, w którym znajduje się gracz, i czy sprawdza, czy czas jednostka powinna znajdować się w tym samym pomieszczeniu w tym konkretnym czasie, istoty, których wzory nie przecinają się z bieżącym pokojem, w którym znajduje się gracz, nie rób nic, dopóki gracz nie wejdzie do pokoju, w którym przecina się ich wzór, i tylko w tym momencie oblicza, czy nie powinni renderować. (Ale jeśli wejdą w interakcję z pokojem, będą musieli zawsze sprawdzać stan pokoi, które przecinają ich trasę, aby ustalić ich lokalizację w danym momencie, co nie jest takie świetne.)

  3. Trzecią opcją, do której doszedłem, byłoby po pierwsze spojrzenie tylko na trasy, które przecinają lokalizację gracza (jak opisano wcześniej), po drugie po wejściu do pokoju sprawdź, czy gracz jest w tym pokoju, a jeśli nie, to tylko sprawdź stan pokoju i ile czasu zajmie przejście do następnego pokoju. Na przykład woźny NPC wchodzi do pokoju, sprawdza stan pokoju, widzi, że gracz rozlał się, oblicza, ile czasu zajmie oczyszczenie go i jak długo potrwa ściekanie itp. I do wspomnianego czas na wejście do następnego pokoju, sprawdzamy tylko, czy gracz jest w pokoju. Dokładna lokalizacja NPC do celów renderowania zostanie obliczona tylko wtedy, gdy gracz wejdzie do pokoju.

Po burzy mózgów doszedłem do trzeciej opcji, ale zastanawiałem się, czy może jest znany lub lepszy sposób radzenia sobie z takimi rzeczami?

Gekon sufitowy
źródło
1
To pytanie przypomina mi blog deweloperski, który czytałem dla gry o nazwie Project Zomboid.
Sumurai8,

Odpowiedzi:

12

Bardzo prostym podejściem jest użycie „poziomu szczegółowości AI”. Z grubsza oznacza to, że częściej aktualizujesz AI, im bliżej odtwarzacza / aparatu. Możesz także zmniejszyć złożoność obliczeń AI, które są dalej, szczególnie. do znalezienia ścieżki. W końcu, jeśli gracz nie widzi dobrze postaci lub wcale, nie ma sensu wkładać dużej ilości wysiłku w symulowanie postaci z najwyższą dokładnością.

W twoim przykładzie pomieszczenie, w którym znajduje się gracz, może uzyskać najwyższą dokładność (AI aktualizuje każdą klatkę, pełna rozdzielczość). Sąsiednie pokoje mogą uzyskać następną najwyższą dokładność (aktualizuje co 10 tyknięć, usuwa wygładzanie ścieżki i animacje). Wszystkie pozostałe pokoje mogą uzyskać najniższą dokładność (aktualizuje co sekundę, wyszukiwanie ścieżek w niskiej rozdzielczości, eliminuje zbędne interakcje między NPC a NPC).

Większe i bardziej złożone gry mogą (i miały) podobne podejście. Mogą uprościć obliczenia bojowe, teleportować postacie, zamiast znajdować je, gdy trzeba się poruszać itp.

Jeśli Twoja gra jest na tyle duża, że ​​nie możesz cały czas zachować jej w pamięci, dobrym rozwiązaniem jest zapisanie ostatniej aktualizacji w zapisanych danych pokoju i odtworzenie jej symulacji poza ekranem (w najniższej rozdzielczości), gdy jest załadowane z powrotem.

Jeśli spodziewasz się, że sztuczna inteligencja przeniesie się do „żywych” obszarów z nieobciążonych „uśpionych” obszarów zgodnie z harmonogramem, albo będziesz chciał utworzyć dane o bardzo niskiej wierności dla tych regionów, aby cały czas pozostawały w pamięci (np. Tylko najgrubsze poziom szczegółowości navmesh i kluczowe lokalizacje obiektów / postaci) lub będziesz okresowo przełączać te obszary (np. utrzymywać X „uśpionych” obszarów w pamięci i przeprowadzać symulacje z niską wiernością przy rzadkich aktualizacjach, a następnie przekręcać je przez wszystkie „ „uśpione” obszary, na których znajdują się kluczowe aktywne postacie niezależne, rozładowując i ładując obszary).

Sean Middleditch
źródło
1

Przechowałbym byty, które obecnie znajdują się w pokoju w tej instancji pokoju, obiekt pokoju śledziłby również, które byty musiały być zaktualizować (np. Udać się do innego pokoju lub zmienić coś w tym pokoju itp.). I aktualizowałbym także jeden (lub więcej) pokój co sekundę (może w innym wątku).

Kiedy aktualizujesz pokój, pozycje NPC powinny zostać zaktualizowane, a wszystkie działania, które wykonały, które wchodzą w interakcje z pokojem od czasu ostatniej aktualizacji, powinny być również obsługiwane, w końcu czas następnej potrzebnej aktualizacji powinien zostać sprawdzony / zaktualizowany.

Jeśli jednostka podróżuje z jednego pokoju do drugiego, jego instancja powinna być przechowywana w drugim pokoju i następna aktualizacja jednostki powinna zostać zaktualizowana.

W ten sposób musisz tylko aktualizować bieżący pokój i pokoje, które mają zaplanowaną aktualizację w tym momencie, aktualizacja innych pokoi jest po prostu opcjonalna (ale zalecana, jeśli masz AI, która aktualizuje się, gdy gracz się poruszy lub coś zrobi) .

jbakker
źródło