Sdílet prostřednictvím


Ztracená zařízení (Direct3D 9)

Zařízení Direct3D může být v provozním stavu nebo ztraceném stavu. Provozní stav je normální stav zařízení, ve kterém se zařízení spouští a zobrazuje veškeré vykreslování podle očekávání. Zařízení provede přechod do ztraceného stavu, když událost, například ztráta fokusu klávesnice v aplikaci na celé obrazovce, způsobí, že vykreslování nebude možné. Ztracený stav je charakterizován tichým selháním všech operací vykreslování, což znamená, že metody vykreslování mohou vrátit kódy úspěchu, i když operace vykreslování selžou. V této situaci je kód chyby D3DERR_DEVICELOST vrácen IDirect3DDevice9::P resent.

Na základě návrhu není zadána úplná sada scénářů, které můžou způsobit ztrátu zařízení. Mezi typické příklady patří ztráta fokusu, například když uživatel stiskne kombinaci kláves ALT+TAB nebo při inicializaci systémového dialogového okna. Zařízení se můžou také ztratit kvůli události řízení spotřeby nebo když jiná aplikace předpokládá operaci na celé obrazovce. Kromě toho všechna selhání z IDirect3DDevice9::Reset zařízení umístí do ztraceného stavu.

Všechny metody odvozené od IUnknown jsou zaručeny, že po ztrátě zařízení fungují. Po ztrátě zařízení má každá funkce obecně následující tři možnosti:

  • Selhání s D3DERR_DEVICELOST – to znamená, že aplikace musí rozpoznat, že zařízení bylo ztraceno, aby aplikace identifikovala, že se něco neděje podle očekávání.
  • Bezobslužné selhání, vrácení S_OK nebo jiných návratových kódů – pokud funkce bezobslužně selže, aplikace obecně nedokáže rozlišit výsledek "úspěch" a "tiché selhání".
  • Funkce vrátí návratový kód.
Rozdíly mezi Direct3D 9 a Direct3D 9Ex:
Zařízení Direct3D 9 vrací D3DERR_DEVICELOST. Jakmile se vrátí z IDirect3DDevice9::P resentní, chování emulace už nebude fungovat a všechna budoucí volání selžou, dokud se zařízení úspěšně resetuje.
Zařízení Direct3D 9Ex nikdy nevrací D3DERR_DEVICELOST, ale může vracet nové stavové zprávy (viz změny chování zařízení).

 

Reakce na ztracené zařízení

Ztracené zařízení musí po resetování znovu vytvořit prostředky (včetně prostředků paměti videa). Pokud dojde ke ztrátě zařízení, aplikace se dotazuje na zařízení a zjistí, jestli se dá obnovit do provozního stavu. Pokud ne, aplikace počká, dokud nebude možné zařízení obnovit.

Pokud je možné zařízení obnovit, aplikace připraví zařízení zničením všech prostředků paměti videa a všech prohození řetězců. Potom aplikace volá metodu IDirect3DDevice9::Reset. Reset je jediná metoda, která má účinek, když dojde ke ztrátě zařízení, a je jedinou metodou, pomocí které může aplikace změnit zařízení ze ztráty na provozní stav. Obnovení selže, pokud aplikace nevyvolá všechny prostředky přidělené v D3DPOOL_DEFAULT, včetně prostředků vytvořených IDirect3DDevice9::CreateRenderTarget a IDirect3DDevice9::CreateDepthStencilSurface metody.

Ve většině případů vysokofrekvenční volání Direct3D nevracejí žádné informace o tom, jestli došlo ke ztrátě zařízení. Aplikace může i nadále volat metody vykreslování, jako je IDirect3DDevice9::D rawPrimitive, bez oznámení o ztraceném zařízení. Tyto operace se interně zahodí, dokud se zařízení nespustí do provozního stavu.

Aplikace může určit, co dělat při výskytu ztraceného zařízení dotazováním návratové hodnoty IDirect3DDevice9::TestCooperativeLevel metoda.

Uzamykání operací

Direct3D interně funguje dostatečně, aby se zajistilo, že operace uzamčení proběhne úspěšně po ztrátě zařízení. Není však zaručeno, že data prostředku paměti videa budou během operace uzamčení přesná. Zaručuje se, že se nevrátí žádný kód chyby. To umožňuje psát aplikace bez obav o ztrátu zařízení během operace uzamčení.

Prostředky

Prostředky můžou využívat paměť videa. Vzhledem k tomu, že ztracené zařízení je odpojeno od paměti videa vlastněné adaptérem, není možné zaručit přidělení paměti videa při ztrátě zařízení. V důsledku toho se všechny metody vytváření prostředků implementují tak, aby byly úspěšné vrácením D3D_OK, ale ve skutečnosti přidělují pouze fiktivní systémovou paměť. Vzhledem k tomu, že všechny prostředky paměti videa musí být zničeny před změnou velikosti zařízení, neexistuje žádný problém s přidělováním paměti videa. Tyto fiktivní povrchy umožňují normální fungování operací uzamčení a kopírování, dokud aplikace nevolá IDirect3DDevice9::P resentní a zjistí, že zařízení bylo ztraceno.

Všechna paměť videa musí být vydána, aby bylo možné zařízení resetovat ze ztraceného stavu do provozního stavu. To znamená, že aplikace by měla uvolnit všechny prohozené řetězce vytvořené pomocí IDirect3DDevice9::CreateAdditionalSwapChain a všechny prostředky umístěné ve třídě paměti D3DPOOL_DEFAULT. Aplikace nemusí vydávat prostředky ve třídách paměti D3DPOOL_MANAGED ani D3DPOOL_SYSTEMMEM. Přechod na provozní stav automaticky zničí jiná data stavu.

Doporučujeme vyvíjet aplikace s jednou cestou kódu, která reaguje na ztrátu zařízení. Tato cesta kódu bude pravděpodobně podobná, pokud není identická, s cestou kódu, kterou jste získali k inicializaci zařízení při spuštění.

Načtená data

Direct3D umožňuje aplikacím ověřovat textury a vykreslovat stavy proti vykreslování s jedním průchodem hardwarem pomocí IDirect3DDevice9::ValidateDevice. Tato metoda, která se obvykle vyvolá během inicializace aplikace, vrátí D3DERR_DEVICELOST, pokud dojde ke ztrátě zařízení.

Direct3D také umožňuje aplikacím kopírovat vygenerované nebo dříve napsané obrázky z prostředků paměti videa do nevolatilních systémových paměťových prostředků. Vzhledem k tomu, že zdrojové image těchto přenosů mohou být kdykoli ztraceny, Direct3D umožňuje takové operace kopírování při ztrátě zařízení selhat.

Pokud jde o asynchronní dotazy, IDirect3DQuery9::GetData vrátí D3DERR_DEVICELOST pokud je zadán příznak FLUSH, aby bylo možné indikovat aplikaci, že IDirect3DQuery9::GetData nikdy nevrátí S_OK.

Operace kopírování, IDirect3DDevice9::GetFrontBufferData, může selhat s D3DERR_DEVICELOST, protože při ztrátě zařízení není k dispozici žádná primární plocha. IDirect3DDevice9::CreateAdditionalSwapChain může také selhat s D3DERR_DEVICELOST, protože při ztrátě zařízení nejde vytvořit vyrovnávací paměť zpět. Všimněte si, že tyto případy jsou jedinou instancí D3DERR_DEVICELOST mimo IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevela IDirect3DDevice9::Reset metody.

Programovatelné shadery

V režimu Direct3D 9 není nutné po resetování znovu vytvářet shadery vrcholů a pixelové shadery. Budou si pamatovat. V předchozích verzích Rozhraní DirectX bylo potřeba ztracené zařízení znovu vytvořit shadery.

zařízení Direct3D