21 czerwca 2011

Prosty menadżer zasobów

W poście wyświetlanie obrazu przedstawiłem w jak można wczytać grafikę do programu. To rozwiązanie jest akurat bardzo łatwe, ale i zarazem pozostawia sobie wiele do życzenia.

W grach bardzo często zachodzi konieczność wyświetlenia tej samej grafiki w wielu miejscach na ekranie jednocześnie. Uzmysławiającym przykładem może być rysowanie terenu gry platformowej. Tutaj wczytuje się niewielkie obszary grafiki, które w efekcie powiela się wielokrotnie na ekranie.



Jednak jeśli gra wymaga, aby 100 razy narysować taką kostkę to nierozsądne byłby tworzenie 100 loaderów po to, by wczytać 100 identycznych grafik. To postępowanie byłoby nierozsądne i szybko sprawiłoby, że gra stanie się strasznie pamięciożerna. Można się o tym przekonać wywołując funkcję informującą o aktualnym zużyciu pamięci.

Zdecydowanie lepszym rozwiązaniem jest wczytanie tylko jednej grafiki na wzór której gra będzie rysować te same kostki platformy. Wykonanie tego nie jest akurat tak oczywiste jak się wydaje, bo loader po wczytaniu grafiki wiąże ją ze swoimi współrzędnymi. Ważne jest odpowiednie wydobycie danych z loadera. Sposób ten przedstawiam w źródle programu.

Samo pozyskanie referencji na zasób to nie koniec pracy. Należy liczyć się, że w grze może być takich przypadków bardzo wiele, a ich rozrzutne traktowanie może sprawić, że kod gry stanie się makabryczny.

Dlatego warto zbudować klasę, która zajmuje się zarządzaniem zasobów. W moim przypadku utworzyłem klasę, która wczytuje zasoby, a następnie przechodzi w stan globalnego udostępniania, a wszystko za sprawą wzorca singleton.

Rozwiązanie przedstawia poniższy kod.

Kod:
http://3paste.com/s/2617
http://3paste.com/s/2621



Oczywiście ten efekt jest prosty i niespecjalnie nadaje się dla dużych aplikacji. Tutaj tylko menadżer raz wczytuje zasoby i następnie przetrzymuje je do końca przebiegu gry. To podejście na dłuższa meta nie jest rozsądne, dlatego w większych grach można wprowadzić funkcje do zwalniania i przydzielania zasobów dla poszczególnych poziomów gry.http://3paste.com/s/2621

Brak komentarzy:

Prześlij komentarz