Pozbywając się tylko niektórych zasobów w XNA?

13

ContentManager w XNA 4.0 ma tylko jedną metodę Unload (), która zwalnia wszystkie zasoby.

Chcę mieć jakieś „globalne” zasoby, które są zawsze ładowane, ale potem chcę zasoby na poziom, które powinny zostać rozładowane, gdy poziom zostanie zmieniony.

Czy powinienem utworzyć drugą instancję menedżera treści ContentManager jako część klasy Level.cs? A może powinienem użyć Game.Content, a następnie wywołać funkcję .Dispozycjonować na ładowanych zasobach? A może powinienem utworzyć własnego menedżera treści ContentManager na podstawie funkcji ReadAsset, jak opisano tutaj ?

Michael Stum
źródło

Odpowiedzi:

12

Utwórz drugą instancję ContentManager.

Nigdy nie należy Dispose()ładować z ContentManager (przy użyciu domyślnej implementacji), ponieważ te instancje są udostępniane i ponownie wykorzystywane.

Tworzenie własnej wersji ContentManager jest swego rodzaju ortogonalne. Tak czy inaczej, będziesz tworzyć drugie wystąpienie ContentManager (lub klasę z niego pochodną). Więc jeśli istniejąca implementacja odpowiada Twoim celom - użyj jej, w przeciwnym razie zastąp to, co chcesz zmienić.

Oczywiście, jeśli twoja gra jest stosunkowo niewielka - to nie będzie miało znaczenia, jeśli użyjesz tylko jednego menedżera treści i nie będziesz zawracał sobie głowy rozładowywaniem zawartości między poziomami.

Andrew Russell
źródło
5
+1 i przypomnienie dla siebie, aby link tutaj następnym razem ktoś mi powiedział, jak wspaniały jest wzór singletonów dla zarządzających aktywami.
Znalazłem też demo Game State Management na stronie internetowej XNA, która korzysta właśnie z tego (1 globalny menedżer zawartości i drugi na ekranach, które tego potrzebują). Niezbyt intuicyjne, ale się
uda