RTS Game AI Thread

14

Mam projekt stworzenia od podstaw gry strategicznej w czasie rzeczywistym. Wciąż jestem na wczesnym etapie planowania, ale trochę programowałem, żeby zobaczyć mechanikę.

Wiem jak programować. Mam również dobry pomysł na to, jak ustrukturyzuję klasy gier i sztuczną inteligencję opartą na regułach (komputer-maszyna) dla gracza komputerowego.

Chcę opracować Doktryny, które nadadzą określone zachowanie konkretnej jednostce (ale mogą być użyte na wielu jednostkach jednocześnie), takie jak Zwiadowca, Podążaj trasą misji, Utrzymaj pozycję (zaatakuj dowolnego zbliżającego się wroga lub wycofaj się, jeśli zostaniesz przytłoczony) itp.

Doktryny będą miały zastosowanie tylko do jednostek, więc będą miały perspektywę jednostki i nie będą świadome na całej mapie mapy.

Komputerowa sztuczna inteligencja przeanalizuje całą widoczną mapę i zdecyduje, do której społeczności przypisać każdą jednostkę w zależności od innego zestawu zasad.

Robię to w C # z OpenGL.

Na razie nie mam dużo, tylko kilka rzeczy w testach, zanim zacznę moją główną koncepcję. Mam pętlę gry, w której odbywa się całe przetwarzanie gry (gdzie będę nazywał aktualizację, walkę, renderowanie itp.) Jedna po drugiej), jest wywoływana bardzo często, jeśli zdarzenie Application.Idle.

Teraz się zastanawiałem. Ponieważ w gameloopie będzie wiele rzeczy do przetworzenia, czy AI komputerowa i jednostki powinny wybrać swoje działania w tej pętli, czy też będzie to zbyt wolne?

Jeśli chcę, aby wszystkie rzeczy odbywały się jednocześnie, Czy powinienem utworzyć osobny wątek dla AI komputera? A może nawet osobny wątek dla każdej jednostki?

Nie mam dużego doświadczenia z wielowątkowością. Jakie byłoby najlepsze podejście do tego?

Nate
źródło
Niepowiązany - uważany za Ogre3D zamiast OpenGL?
Właściwie nie, nigdy o tym nie słyszałem. Korzystam z OpenGL, ponieważ tego nauczyłem się na moich zajęciach. Czy Ogre3D może również wykonywać 2D? Przypuszczam, że tak, ale nigdy nie wiemy ...
Tak, może nawet ma własny zestaw narzędzi GUI (cegui). Na przykład TorchLight jest z nim zbudowany. Może zaoszczędzić czas, ponieważ ładnie otacza AROUND OpenGL. ogre3d.org/tikiwiki/MOGRE
„Lub nawet osobny wątek dla każdej jednostki” Piekło nr. Narzut nici jest o wiele za duży. Dla jednego jest zarezerwowana pamięć na stos wątku (domyślnie 1 MB). A przełączniki wątków też są drogie.
migrowane według meta.gamedev.stackexchange.com/questions/434/…
Jeff Atwood

Odpowiedzi:

3

Co znaczy „od zera”? Czy możesz użyć czegoś takiego jak XNA zamiast DirectX?

Powinieneś renderować coś między 30 a 60 klatkami na sekundę, aby uzyskać płynny ruch. Naprawdę nie ma potrzeby, aby mieć więcej fps.

Jeśli rendering + logika zajmuje mniej niż 16 ms, które daje 60 klatek na sekundę, to nie powinno być potrzeby stosowania wątku AI.

Jeśli nie będziesz mieć wystarczająco dużo czasu między renderowaniem ramek, będziesz musiał bardzo dokładnie przemyśleć, co należy zaktualizować w każdej ramce, a co nie.

Zgaduję, że część „doktryn” powinna być tak prosta i wydajna, jak to możliwe, aby można ją było aktualizować co klatkę, przynajmniej w przypadku jednostek widocznych i innych w pobliżu. Jednostki, które nie wpływają bezpośrednio na jednostki widoczne, mogą być aktualizowane rzadziej (i odpowiednio, z większą różnicą T).

Główna sztuczna inteligencja ma więcej pracy do wykonania, ponieważ musi przetworzyć wszystkie jednostki na mapie i opracować strategię, więc powinna zająć większość czasu obliczeniowego. Jest to pierwszy kandydat do osobnego wątku.

Zauważ, że możesz chcieć dodać kolejną warstwę między nimi, coś w rodzaju AI na poziomie drużyny. Zasadniczo AI każdej jednostki powinno upewnić się, że jednostka „inteligentnie” reaguje na bezpośrednią sytuację, więc musi być szybka i reagować. AI drużyny jest odpowiedzialne za „inteligentne” działania kilku jednostek, rozłożone na kilka sekund, takie jak znalezienie mostu, jeśli drużyna musi przekroczyć rzekę. A główna sztuczna inteligencja powinna kierować działaniami wielu oddziałów przez długi czas.

Zwłaszcza jeśli nie masz dużego doświadczenia, nie rób wątków, jeśli nie musisz. Będzie to skomplikowane, ponieważ nie wiąże się to z dodatkowym obciążeniem. Możesz nauczyć się wielowątkowości jako osobnego projektu lub jako przedłużenie tego, gdy jest on w stanie roboczym . Powodzenia!


źródło
0

Mają osobny wątek dla AI. Ale nie dla każdej jednostki, ponieważ zużywałaby ona zbyt dużo zasobów systemu operacyjnego, a synchronizacja byłaby koszmarem.

Upewnij się, że wątek AI znajdzie możliwość wykonania. Nie bierz tego lekko, jeśli główny wątek robi zbyt wiele rzeczy, może nigdy nie znaleźć takiej okazji! Jeśli po prostu nadasz wątkowi AI wyższy priorytet, gra przestanie odpowiadać, co jest niedopuszczalne.

Ostrożnie wybierz punkty synchronizacji i / lub zdarzenia w głównej pętli i pozwól, aby wątek AI zakończył obliczenia, dopóki główny wątek się zatrzyma. Na przykład, jeśli jednostka użytkownika widzi inną jednostkę AI, zsynchronizuj ją, aby jednostka zobaczyła zaktualizowaną jednostkę na odwrót.


źródło
0

Pracuję również nad grą RTS od zera. Jeszcze go nie testowałem, ale moim pomysłem było uruchomienie jednostki AI w głównej pętli gry dla wszystkich jednostek, które są obecnie widoczne dla gracza (w części ekranu, którą gracz faktycznie widzi, lub w pobliżu granicy tego ekranu ), ponieważ bardziej prawdopodobne jest, że gracz trochę poruszy ekran.

Pozostałe jednostki są sprawdzane w osobnym wątku, a ja mam dwa priorytety: 1. Jednostki, które są w miejscach widocznych dla użytkownika, jeśli przesunie tam ekran. 2. Jednostki znajdujące się w ukrytych obszarach (jeszcze nie zbadane i „mgła wojny”).

W przypadku jednostek o priorytecie sekund rzadziej uruchamiam pętlę i kompensuję, przesuwając je retrospektywnie w razie potrzeby.


źródło
1
Brzmi bardzo skomplikowanie.
Twój pomysł brzmi dobrze, z wyjątkiem pierwszej części dotyczącej przemieszczania jednostek do głównej pętli gry i z niej. Cała sztuczna inteligencja powinna odbywać się we własnej pętli, w której możesz pominąć pętlę przy każdej xiteracji na jednostkach o niskim priorytecie.
Olhovsky
0

Niezależnie od tego, czy potrzebujesz wielowątkowości, czy nie, dobrym pomysłem może być przygotowanie AI do wielowątkowości.

Wasz główny wątek zaktualizowałby świat, zaznaczył fizykę itp., A następnie wypełniłby strukturę danych, która reprezentuje pogląd AI na świat: położenie jednostek, stan zasobów itp. Ta struktura danych raczej buforowałaby główne systemy niż tylko trzymaj do nich wskaźniki. Czasami nazywa się to punktem synchronizacji.

Przekaż tę strukturę danych do sztucznej inteligencji i pozwól jej jedynie na uzasadnienie zawartości tej struktury. Jeśli zauważysz, że AI potrzebuje więcej informacji, dodaj ją do struktury. W mowie AI jest to często nazywane tablicą, ale może być również określane jako pamięć podręczna. Nigdy nie pozwól sztucznej inteligencji zapisywać w pamięci podręcznej, dane wyjściowe powinny przechodzić przez osobną strukturę danych.

Ta konfiguracja pozwoli na zrównoleglenie gry, ponieważ AI nie ma już bezpośredniej zależności od innych systemów gry. Te systemy nie muszą być bezpieczne dla wątków i nigdy nie powinieneś otrzymywać blokad. Możesz bezpiecznie uruchomić renderer lub coś, podczas gdy AI wiruje.

Dodatkową korzyścią jest możliwość rozszerzenia pamięci podręcznej w przyszłości poprzez zanikanie informacji uzyskiwanych z innych systemów w czasie, symulując raczej niepewność niż dokładną wiedzę.

tenpn
źródło