Automatyczne zarządzanie teksturami (Direct3D 9)
Zarządzanie teksturami to proces określania, które tekstury są potrzebne do renderowania w danym momencie i zapewnienia, że te tekstury są ładowane do pamięci wideo. Podobnie jak w przypadku każdego algorytmu, schematy zarządzania teksturami różnią się złożonością, ale każde podejście do zarządzania teksturami obejmuje następujące kluczowe zadania.
- Śledzenie ilości dostępnej pamięci tekstury.
- Obliczanie, które tekstury są potrzebne do renderowania, a które nie.
- Określenie, które istniejące zasoby tekstury można ponownie załadować za pomocą innego obrazu tekstury, oraz które powierzchnie powinny zostać zniszczone i zastąpione nowymi zasobami tekstury.
Funkcja Direct3D implementuje zarządzanie teksturami obsługiwanymi przez system w celu zapewnienia, że tekstury są ładowane w celu uzyskania optymalnej wydajności. Zasoby tekstury zarządzane przez funkcję Direct3D są określane jako zarządzane tekstury.
Menedżer tekstur śledzi tekstury z sygnaturą czasową, która identyfikuje, kiedy tekstura była ostatnio używana. Następnie używa najmniej ostatnio używanego algorytmu do określenia, które tekstury powinny zostać usunięte. Priorytety tekstury są używane jako wyłączniki, gdy dwie tekstury są przeznaczone do usunięcia z pamięci. Jeśli dwie tekstury mają tę samą wartość priorytetu, najmniej używana tekstura zostanie usunięta. Jeśli jednak dwie tekstury mają ten sam znacznik czasu, tekstura o niższym priorytecie jest najpierw usuwana.
Żądasz automatycznego zarządzania teksturami dla powierzchni tekstury podczas ich tworzenia. Aby pobrać zarządzaną teksturę w aplikacji języka C++, utwórz zasób tekstury, wywołując IDirect3DDevice9::CreateTexture i określając D3DPOOL_MANAGED parametru Pula. Nie można określić, gdzie ma zostać utworzona tekstura. Podczas tworzenia tekstury zarządzanej nie można używać flag D3DPOOL_DEFAULT ani D3DPOOL_SYSTEMMEM. Po utworzeniu zarządzanej tekstury można wywołać metodę IDirect3DDevice9::SetTexture, aby ustawić ją na etap kaskadowy tekstury urządzenia renderowania.
Priorytet można przypisać do zarządzanych tekstur, wywołując metodę IDirect3DResource9::SetPriority dla powierzchni tekstury.
Funkcja Direct3D automatycznie pobiera tekstury do pamięci wideo zgodnie z potrzebami. System może buforowania zarządzanych tekstur w lokalnej lub nielokanej pamięci wideo, w zależności od dostępności nielokanej pamięci wideo lub innych czynników. Lokalizacja pamięci podręcznej zarządzanych tekstur nie jest przekazywana do aplikacji ani nie jest wymagana do korzystania z automatycznego zarządzania teksturami. Jeśli aplikacja używa więcej tekstur niż może zmieścić się w pamięci wideo, Direct3D usuwa starsze tekstury z pamięci wideo, aby pomieścić nowe tekstury. W przypadku ponownego użycia usuniętej tekstury system używa oryginalnej powierzchni tekstury pamięci systemowej do ponownego załadowania tekstury w pamięci podręcznej pamięci wideo. Mimo że ponowne ładowanie tekstury jest konieczne, zmniejsza również wydajność aplikacji.
Możesz dynamicznie modyfikować oryginalną kopię tekstury w pamięci systemowej, aktualizując lub blokując zasób tekstury. Gdy system wykryje zanieczyszczoną powierzchnię — po zakończeniu aktualizacji lub po odblokowaniu powierzchni — menedżer tekstur automatycznie aktualizuje kopię tekstury w pamięci wideo. Napotkana wydajność jest podobna do ponownego załadowania usuniętej tekstury.
Podczas wprowadzania nowego poziomu w grze aplikacja może wymagać opróżnienia wszystkich zarządzanych tekstur z pamięci wideo (wywołując IDirect3DDevice9::EvictManagedResources).
Aby uzyskać więcej informacji na temat zarządzania zasobami, zobacz Zarządzanie zasobami (Direct3D 9).
Tematy pokrewne