Megosztás a következőn keresztül:


Elveszett eszközök (Direct3D 9)

A Direct3D-eszközök működési vagy elveszett állapotban lehetnek. A működési állapot annak az eszköznek a normál állapota, amelyben az eszköz fut, és az összes megjelenítést a vártnak megfelelően jeleníti meg. Az eszköz áttér az elveszett állapotra, amikor egy esemény, például a billentyűzetfókusz elvesztése egy teljes képernyős alkalmazásban lehetetlenné teszi a renderelést. Az elveszett állapotot az összes renderelési művelet csendes hibája jellemzi, ami azt jelenti, hogy a renderelési módszerek akkor is sikerkódokat adhatnak vissza, ha a renderelési műveletek sikertelenek. Ebben az esetben a D3DERR_DEVICELOST hibakódot IDirect3DDevice9::P resentadja vissza.

Terv szerint nincs megadva az eszközök elvesztését okozó forgatókönyvek teljes készlete. Néhány tipikus példa a fókusz elvesztésére is, például amikor a felhasználó lenyomja az ALT+TAB billentyűkombinációt, vagy amikor a rendszer párbeszédpanelje inicializálva van. Az eszközök energiagazdálkodási esemény miatt is elveszhetnek, vagy ha egy másik alkalmazás teljes képernyős műveletet feltételez. Ezenkívül az IDirect3DDevice9::Reset hiba miatt az eszköz elveszett állapotba kerül.

Az IUnknownszármazó összes metódus garantáltan működni fog az eszköz elvesztése után. Az eszköz elvesztése után az egyes függvények általában a következő három lehetőséget kínálják:

  • Sikertelen D3DERR_DEVICELOST – Ez azt jelenti, hogy az alkalmazásnak fel kell ismernie, hogy az eszköz elveszett, így az alkalmazás azonosítja, hogy valami nem a várt módon történik.
  • Csendes hiba, S_OK vagy bármely más visszatérési kód visszaadása – Ha egy függvény csendesen meghiúsul, az alkalmazás általában nem tud különbséget tenni a "sikeres" és a "csendes hiba" eredménye között.
  • A függvény egy visszatérési kódot ad vissza.
A Direct3D 9 és a Direct3D 9Ex közötti különbségek:
A Direct3D 9-eszközök D3DERR_DEVICELOST ad vissza. Miután visszaadta IDirect3DDevice9::P resent, az emulációs viselkedés már nem működik, és minden jövőbeli hívás meghiúsul, amíg az eszköz alaphelyzetbe nem áll.
A Direct3D 9Ex-eszközök soha nem ad vissza D3DERR_DEVICELOST, de új állapotüzeneteket küldhetnek vissza (lásd eszköz viselkedésének változásait).

 

Válasz elveszett eszközre

Az elveszett eszköznek újra létre kell hoznia az erőforrásokat (beleértve a videomemória-erőforrásokat is) az alaphelyzetbe állítás után. Ha egy eszköz elveszett, az alkalmazás lekérdezi az eszközt, hogy visszaállítható-e a működési állapotba. Ha nem, az alkalmazás megvárja, amíg az eszköz visszaállítható.

Ha az eszköz visszaállítható, az alkalmazás előkészíti az eszközt az összes videomemória-erőforrás és a felcserélési láncok elpusztításával. Ezután az alkalmazás meghívja az IDirect3DDevice9::Reset metódust. Az alaphelyzetbe állítás az egyetlen olyan módszer, amelynek hatása van az eszköz elvesztésekor, és az egyetlen módszer, amellyel az alkalmazás az eszközt elveszettről működési állapotra módosíthatja. Az alaphelyzetbe állítás sikertelen lesz, hacsak az alkalmazás nem bocsátja ki a D3DPOOL_DEFAULT lefoglalt összes erőforrást, beleértve azokat is, amelyeket az IDirect3DDevice9::CreateRenderTarget és IDirect3DDevice9::CreateDepthStencilSurface metódusok hoztak létre.

A Direct3D nagy gyakoriságú hívásai többnyire nem adnak vissza semmilyen információt arról, hogy az eszköz elveszett-e. Az alkalmazás továbbra is meghívhatja a renderelési módszereket, például IDirect3DDevice9::D rawPrimitive, anélkül, hogy értesítést kapnál egy elveszett eszközről. A rendszer belsőleg elveti ezeket a műveleteket, amíg az eszköz vissza nem áll a működési állapotba.

Az alkalmazás a IDirect3DDevice9::TestCooperativeLevel metódus visszatérési értékének lekérdezésével meghatározhatja, hogy mi a teendő egy elveszett eszköz észlelése esetén.

Zárolási műveletek

A Direct3D belsőleg elég munkát végez annak biztosításához, hogy egy zárolási művelet sikeres legyen az eszköz elvesztése után. Azonban nem garantált, hogy a videomemória-erőforrás adatai pontosak lesznek a zárolási művelet során. A rendszer garantáltan nem ad vissza hibakódot. Ez lehetővé teszi az alkalmazások írását anélkül, hogy a zárolási művelet során az eszköz elvesztése miatt aggódnak.

Erőforrások

Az erőforrások videomemóriát használhatnak fel. Mivel egy elveszett eszköz leválasztva van az adapter tulajdonában lévő videomemóriaról, nem garantálható a videomemória lefoglalása az eszköz elvesztésekor. Ennek eredményeképpen az összes erőforrás-létrehozási módszer sikeresen implementálva lesz a D3D_OK visszaadásával, de valójában csak a rendszermemóriát foglalja le. Mivel minden videomemória-erőforrást el kell pusztítani az eszköz átméretezése előtt, nincs probléma a videomemória túlosztásával. Ezek a dummy felületek lehetővé teszik a zárolási és másolási műveletek normál működését, amíg az alkalmazás nem hívja IDirect3DDevice9::P resent, és rájön, hogy az eszköz elveszett.

Az összes videomemóriát ki kell szabadítani, mielőtt az eszköz visszaállítható egy elveszett állapotból működési állapotba. Ez azt jelenti, hogy az alkalmazásnak fel kell szabadítania a IDirect3DDevice9::CreateAdditionalSwapChain és a D3DPOOL_DEFAULT memóriaosztályba helyezett összes erőforrást. Az alkalmazásnak nem kell erőforrásokat felszabadítania a D3DPOOL_MANAGED vagy D3DPOOL_SYSTEMMEM memóriaosztályokban. Az egyéb állapotadatok automatikusan megsemmisülnek az operatív állapotra való áttérés során.

Javasoljuk, hogy egyetlen kódútvonallal rendelkező alkalmazásokat fejlesszen ki, hogy reagáljon az eszközvesztésre. Ez a kód elérési útja valószínűleg hasonló lesz, ha nem azonos az eszköz indításkor történő inicializálásához szükséges kódútvonalhoz.

Lekért adatok

A Direct3D lehetővé teszi az alkalmazások számára, hogy az IDirect3Device9::ValidateDevice használatával érvényesítse a textúrát és a renderelési állapotokat a hardver egyszeri továbbítású renderelése ellen. Ez a metódus, amelyet általában az alkalmazás inicializálása során hívunk meg, D3DERR_DEVICELOST ad vissza, ha az eszköz elveszett.

A Direct3D lehetővé teszi az alkalmazások számára a létrehozott vagy korábban írt képek másolását a videomemória-erőforrásokból a nemvolatilis rendszermemória-erőforrásokba. Mivel az ilyen átvitelek forrásképei bármikor elveszhetnek, a Direct3D lehetővé teszi az ilyen másolási műveletek meghiúsulását az eszköz elvesztésekor.

Az aszinkron lekérdezéseket illetően IDirect3DQuery9::GetData D3DERR_DEVICELOST ad vissza, ha a FLUSH jelölő van megadva, hogy jelezze az alkalmazásnak, hogy IDirect3DQuery9::GetData soha nem ad vissza S_OK.

Az IDirect3Device9::GetFrontBufferDatamásolási művelet meghiúsulhat D3DERR_DEVICELOST, mivel az eszköz elvesztésekor nincs elsődleges felület. IDirect3DDevice9::CreateAdditionalSwapChain is meghiúsulhat D3DERR_DEVICELOST, mert az eszköz elvesztésekor nem hozható létre háttérpuffer. Vegye figyelembe, hogy ezek az esetek az IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevelés IDirect3DDevice9::Reset metódusokon kívüli D3DERR_DEVICELOST egyetlen példánya.

Programozható árnyékolók

A Direct3D 9-ben a csúcs- és képpontárnyékolókat nem kell újra létrehozni az alaphelyzetbe állítás után. Emlékezni fognak rájuk. A DirectX korábbi verzióiban egy elveszett eszköznek újra létre kellett hoznia az árnyékolókat.

Direct3D-eszközök