Trochę o architekturze silnika – #1.2 przegląd możliwości – zasoby
Wysłany dnia 29 sierpnia 2010 o godzinie 16:39. Skomentuj!, kategorie: Kingdoms Clash.NET, Projektowanie, tagi: , .

Zarządzanie zasobami często jest ignorowane, co, przynajmniej dla mnie, jest błędem. Napisanie w pełni funkcjonalnego managera zasobów nie jest trudne, a przynosi wiele korzyści i ułatwia późniejszą pracę. Oczywiście pisanie go dla tylko kilku zasobów mija się z celem, ale gdy zasobów będzie więcej niż „trochę” ułatwi to nam ich ładowaniem/zwalnianiem.

Brak menadżera

Przy tworzeniu moich pierwszych gier nie miałem bladego pojęcia jak zarządzać zasobami – wszystko było ładowane bezpośrednio w kodzie gry i do zasobów miałem dostęp tylko i wyłącznie z miejsca ich ładowania(ew. udostępniałem je jako pola klas/zmienne globalne). Rozwiązanie nie było idealne, ale nie wymagało żadnych dodatkowych nakładów w postaci kodu. Dla małych gier(typu Snake) rozwiązanie było całkowicie akceptowalne i „sprawdzało się”, lecz w większej grze(moja druga gra, jaką pisałem, był „MMO”RPG(a jak!) – skończyłem jej pisanie po ~miesiącu mając gotowe wczytywanie plansz, animacje ludzika i jego poruszanie :P )
i przy większej ilości zasobów to była katorga – trzeba było jakoś dzielić zasoby między klasy. Jak mówiłem, udostępniałem je poprzez pola klas. Ale jakoś musiałem też przechowywać wskaźniki na te klasy… Wyszło coś, co działało, ale było prawie, że niezdatne do użytku. Tylko raz zdarzyło mi się, przez pomyłkę, załadować ten sam zasób dwa razy.

Manager zasobów

Teraz, gdy tworzę cokolwiek, nawet małe gry, zawsze piszę/używam istniejącego managera zasobów. Ułatwia to dostęp do nich, dzięki czemu mam większy porządek w klasach, nie mam problemu z wielokrotnych ich ładowaniem i zwalnianie odbywa się „samo”. W bardziej rozbudowanych managerach można ładować zasoby asynchronicznie, zwalniać je tylko wtedy, gdy są kompletnie nieużywane i zwalniać nieużywane(w tej chwili), gdy brakuje pamięci. Nie trzeba się wtedy przejmować, czy starczy nam pamięci, czy przy zmianie planszy trzeba będzie coś doczytywać(odrobina więcej pracy i gra sama będzie autogamicznie przewidywać, co trzeba wczytać).

Do debugowania i testowania gry przydać się może też manager, który potrafi automatycznie ładować ponownie zasoby, gdy zostały zmienione. Sam niedawno coś takiego zaimplementowałem(bazując na klasie FileSystemWatcher, o czym w następnych notkach) i, po niewielkich perturbacjach z OpenGL, jestem zadowolony, że coś takiego jest. Nie wymagało dużo kodu(całe 60 linijek włącznie z komentarzami) a ile frajdy! :D

Dodaj komentarz

XHTML: Możesz użyć: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>