Utracone urządzenia (Direct3D 9)
Urządzenie Direct3D może być w stanie operacyjnym lub w stanie zgubienia. Stan operacyjny to normalny stan urządzenia, w którym jest uruchomione urządzenie i przedstawia wszystkie renderowanie zgodnie z oczekiwaniami. Urządzenie przechodzi do stanu zgubienia, gdy zdarzenie, takie jak utrata fokusu klawiatury w aplikacji pełnoekranowej, powoduje, że renderowanie staje się niemożliwe. Stan zgubienia charakteryzuje się dyskretnym niepowodzeniem wszystkich operacji renderowania, co oznacza, że metody renderowania mogą zwracać kody powodzenia, mimo że operacje renderowania kończą się niepowodzeniem. W takiej sytuacji kod błędu D3DERR_DEVICELOST jest zwracany przez IDirect3DDevice9::P resent.
Zgodnie z projektem nie określono pełnego zestawu scenariuszy, które mogą spowodować utratę urządzenia. Niektóre typowe przykłady obejmują utratę fokusu, np. po naciśnięciu ALT+TAB przez użytkownika lub zainicjowaniu okna dialogowego systemu. Urządzenia mogą być również utracone z powodu zdarzenia zarządzania energią lub gdy inna aplikacja zakłada operację pełnoekranową. Ponadto wszelkie błędy z IDirect3DDevice9::Reset umieszcza urządzenie w stanie zgubienia.
Wszystkie metody pochodzące z IUnknown mają gwarancję działania po utracie urządzenia. Po utracie urządzenia każda funkcja ma zazwyczaj następujące trzy opcje:
- Niepowodzenie z D3DERR_DEVICELOST — oznacza to, że aplikacja musi rozpoznać, że urządzenie zostało utracone, aby aplikacja zidentyfikowała, że coś nie dzieje się zgodnie z oczekiwaniami.
- Dyskretne niepowodzenie, zwracanie S_OK lub innych kodów powrotnych — jeśli funkcja dyskretnie ulegnie awarii, aplikacja zazwyczaj nie może odróżnić wyniku "powodzenia" i "dyskretnego niepowodzenia".
- Funkcja zwraca kod zwracany.
Różnice między direct3D 9 i Direct3D 9Ex: Urządzenie Direct3D 9 zwraca D3DERR_DEVICELOST. Po powrocie z IDirect3DDevice9::P resentzachowanie emulacji nie będzie już działać, a wszystkie przyszłe wywołania zakończy się niepowodzeniem, dopóki urządzenie nie zostanie pomyślnie zresetowane. Urządzenie Direct3D 9Ex nigdy nie zwraca D3DERR_DEVICELOST, ale może zwrócić nowe komunikaty o stanie (zobacz zmiany zachowania urządzenia). |
Reagowanie na utracone urządzenie
Utracone urządzenie musi ponownie utworzyć zasoby (w tym zasoby pamięci wideo) po jego zresetowaniu. Jeśli urządzenie zostanie utracone, aplikacja wysyła zapytanie do urządzenia, aby sprawdzić, czy można je przywrócić do stanu operacyjnego. Jeśli nie, aplikacja czeka na przywrócenie urządzenia.
Jeśli urządzenie można przywrócić, aplikacja przygotowuje urządzenie, niszcząc wszystkie zasoby pamięci wideo i wszystkie łańcuchy wymiany. Następnie aplikacja wywołuje metodę IDirect3DDevice9::Reset. Reset to jedyna metoda, która ma wpływ w przypadku utraty urządzenia i jest jedyną metodą, za pomocą której aplikacja może zmienić urządzenie z utraconego na stan operacyjny. Resetowanie zakończy się niepowodzeniem, chyba że aplikacja zwolni wszystkie zasoby przydzielone w D3DPOOL_DEFAULT, w tym te utworzone przez metody IDirect3DDevice9::CreateRenderTarget i IDirect3DDevice9::CreateDepthStencilSurface metod.
W większości przypadków wywołania funkcji Direct3D o wysokiej częstotliwości nie zwracają żadnych informacji o tym, czy urządzenie zostało utracone. Aplikacja może nadal wywoływać metody renderowania, takie jak IDirect3DDevice9::D rawPrimitive, bez otrzymywania powiadomienia o utraconym urządzeniu. Operacje te są odrzucane wewnętrznie do momentu zresetowania urządzenia do stanu operacyjnego.
Aplikacja może określić, co należy zrobić w przypadku napotkania utraconego urządzenia, wykonując zapytanie dotyczące zwracanej wartości IDirect3DDevice9::TestCooperativeLevel metody.
Operacje blokowania
Wewnętrznie funkcja Direct3D wykonuje wystarczającą ilość pracy, aby upewnić się, że operacja blokowania zakończy się pomyślnie po utracie urządzenia. Nie ma jednak gwarancji, że dane zasobu pamięci wideo będą dokładne podczas operacji blokady. Gwarantowane jest, że nie zostanie zwrócony żaden kod błędu. Dzięki temu aplikacje mogą być zapisywane bez obaw o utratę urządzenia podczas operacji blokady.
Zasoby
Zasoby mogą zużywać pamięć wideo. Ponieważ utracone urządzenie jest odłączone od pamięci wideo należącej do karty, nie można zagwarantować alokacji pamięci wideo po utracie urządzenia. W związku z tym wszystkie metody tworzenia zasobów są implementowane w celu pomyślnego działania przez zwrócenie D3D_OK, ale w rzeczywistości przydzielić tylko fikcyjną pamięć systemową. Ponieważ każdy zasób pamięci wideo musi zostać zniszczony przed zmianą rozmiaru urządzenia, nie ma problemu z nadmierną alokacją pamięci wideo. Te fikcyjne powierzchnie umożliwiają normalne działanie operacji blokowania i kopiowania, dopóki aplikacja nie wywoła IDirect3DDevice9::P resent i wykryje, że urządzenie zostało utracone.
Aby można było zresetować urządzenie ze stanu zgubienia do stanu operacyjnego, należy zwolnić całą pamięć wideo. Oznacza to, że aplikacja powinna zwolnić wszystkie łańcuchy wymiany utworzone za pomocą IDirect3DDevice9::CreateAdditionalSwapChain i wszystkich zasobów umieszczonych w klasie pamięci D3DPOOL_DEFAULT. Aplikacja nie musi zwalniać zasobów w klasach pamięci D3DPOOL_MANAGED ani D3DPOOL_SYSTEMMEM. Inne dane stanu są automatycznie niszczone przez przejście do stanu operacyjnego.
Zachęcamy do tworzenia aplikacji z pojedynczą ścieżką kodu w celu reagowania na utratę urządzenia. Ta ścieżka kodu może być podobna, jeśli nie jest identyczna, do ścieżki kodu podjętej w celu zainicjowania urządzenia podczas uruchamiania.
Pobrane dane
Funkcja Direct3D umożliwia aplikacjom weryfikowanie stanów tekstury i renderowania pod kątem renderowania pojedynczego przekazywania przez sprzęt przy użyciu IDirect3DDevice9::ValidateDevice. Ta metoda, która jest zwykle wywoływana podczas inicjowania aplikacji, zwróci D3DERR_DEVICELOST, jeśli urządzenie zostało utracone.
Funkcja Direct3D umożliwia również aplikacjom kopiowanie wygenerowanych lub wcześniej zapisanych obrazów z zasobów pamięci wideo do nieuwolonych zasobów pamięci systemowej. Ponieważ obrazy źródłowe takich transferów mogą zostać utracone w dowolnym momencie, funkcja Direct3D pozwala na niepowodzenie takich operacji kopiowania po utracie urządzenia.
Jeśli chodzi o zapytania asynchroniczne, IDirect3DQuery9::GetData zwraca D3DERR_DEVICELOST, jeśli określono flagę FLUSH, aby wskazać aplikację, która IDirect3DQuery9::GetData nigdy nie zwróci S_OK.
Operacja kopiowania, IDirect3DDevice9::GetFrontBufferData, może zakończyć się niepowodzeniem z D3DERR_DEVICELOST, ponieważ nie ma podstawowej powierzchni, gdy urządzenie zostanie utracone. IDirect3DDevice9::CreateAdditionalSwapChain może również zakończyć się niepowodzeniem z D3DERR_DEVICELOST, ponieważ nie można utworzyć buforu wstecznego podczas utraty urządzenia. Należy pamiętać, że te przypadki są jedynym wystąpieniem D3DERR_DEVICELOST poza IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLeveli IDirect3DDevice9::Reset metod.
Programowalne cieniowania
W trybie Direct3D 9 cieniowanie wierzchołków i cieniowania pikseli nie musi być ponownie tworzone po zresetowaniu. Zostaną zapamiętani. W poprzednich wersjach directX utracone urządzenie wymaga ponownego utworzenia cieniowania.
Tematy pokrewne
-
urządzeń Direct3D