Załóżmy, że masz grę, w której istnieje wiele (wiele) bytów pełniących niektóre funkcje, z których nie wszystkie są stale potrzebne lub należy je rozpatrywać w każdej ramce. Konkretnym problemem, nad którym pracuję, w którym występuje ten problem, jest szczegółowa symulacja ciała, w tym jego organów.
W grze każde stworzenie ma własne ciało, które jest podzielone na mniejsze części (tułów, nogi itp.), A czasami te części zawierają narządy, które pełnią określoną funkcję w ciele. To, czy organ obecnie służy celowi, czy jest aktywny, nigdy nie jest jasne. W końcu zwierzę może mieć pusty żołądek, który w związku z tym nie musi niczego trawić. Sprawdzanie lub symulacja każdego obiektu w każdej klatce byłoby bardzo śmieszne i bardzo kosztowne, gdy tylko pojawi się wiele stworzeń na świecie. Zastanawiałem się więc nad sposobem inteligentnego rozróżnienia między obiektami, które wymagają aktualizacji, a tymi, które tego nie robią.
To, co wymyśliłem, wydaje się co najmniej dobrym rozwiązaniem. Tworzy prostą kolejkę / stos (istotne jest to, że każdy element jest usuwany natychmiast po jego odczytaniu; kolejność nie ma znaczenia) nazywana „stosem uwagi”, w którym znajdują się obiekty, które należy symulować. Przedmioty wymagające uwagi po prostu ułożyłyby się na stosie lub zostałyby tam umieszczone przez inne obiekty. Obiekty te prawdopodobnie zaimplementują prosty interfejs z funkcją simulate ().
W przypadku mojego poprzedniego przykładu trawienia oznaczałoby to:
Gracz wybiera z ekwipunku coś do jedzenia (zakładając, że to chleb) i wkłada go do ust swojej postaci, a usta umieszcza na stosie uwagi. W następnej klatce usta są pobierane ze stosu i wywoływana jest jego funkcja symulacji (). Ponieważ jest to usta, rozsądnie byłoby symulować tutaj żucie. Może to trwać kilka ramek, w których usta ustawiają się na stosie, dopóki nie zdecydują, że jedzenie jest gotowe do połknięcia. W tym przypadku usta wkładają przeżuty chleb do żołądka (wiem, że nie trafia tam bezpośrednio, ale przełyk jest pominięty dla uproszczenia), który jest następnie umieszczany na stosie uwagi. W następnej ramce rozpoczyna się symulacja procesu trawienia. I tak dalej dla pozostałych niezbędnych narządów.
Przewidywalnym problemem z tym są obiekty na biegu jałowym. Śpiące zwierzę jest tego dobrym przykładem. Można to zrobić zgodnie z wcześniejszym opisem, utrzymując śpiące zwierzę na stosie i za każdym razem sprawdzając, czy trzeba się obudzić, ale wydaje się to marnotrawstwem, ponieważ jest to jedyna rzecz, jaką się robi. Aby uczynić obiekty na biegu jałowym bardziej wydajnym, planowałem dodać rodzaj harmonogramu, który przechowuje zadania do wykonania w określonym czasie. Jeśli zwierzę pójdzie spać, wykona pracę według tego harmonogramu, który będzie zaplanowany na pewien czas po tym, jak zwierzę pójdzie spać. Zadanie to polegałoby na ponownym umieszczeniu śpiącego zwierzęcia na stosie uwagi. Teraz możesz powiedzieć, że śpiące zwierzę, które nie znajduje się na stosie uwagi, może przegapić atak czegoś, ponieważ jego sztuczna inteligencja nie jest symulowana,
Teraz, szczerze mówiąc, nie wiem, czy jest to blisko eleganckiego rozwiązania tego problemu z powodu braku doświadczenia. Czy jestem blisko czegoś użytecznego? Jak to zwykle się robi lub czy ktoś ma jakieś sugestie lub lepsze rozwiązania?