Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
"Enheten har förlorats" avser en situation där GPU-grafikenheten blir oanvändbar för ytterligare återgivning. Detta kan inträffa på grund av GPU-maskinvarufel, drivrutinsbuggar, uppdateringar av drivrutinsprogramvara eller växling av appen från en GPU till en annan. En förlorad enhet kan inte längre användas, och alla försök att göra det från Win2D utlöser ett undantag. För att återställa från den här situationen måste appen skapa en ny enhet och sedan återskapa alla sina grafikresurser.
Inte alla appar bryr sig om att försöka återhämta sig efter en förlorad enhet. Detta är en (förhoppningsvis!) sällsynt situation, så vissa utvecklare låter bara sina appar krascha om det inträffar. För dem som föredrar att hantera förlorade enheter på ett robust sätt förklarar den här artikeln hur.
Enheten gick förlorad när XAML-kontroller användes
Win2D-kontrollerna (CanvasControlCanvasVirtualControloch CanvasAnimatedControl) försöker automatiskt hantera enheter som förlorats för appens räkning.
När en förlorad enhet identifieras, återskapar dessa kontroller sina CanvasDevice och genererar sedan CreateResources-händelsen och skickar en CanvasCreateResourcesReason för NewDevice. Appar bör svara på den här händelsen genom att återskapa alla sina grafikresurser med hjälp av den nya enheten och uppdatera alla datastrukturer som kan innehålla referenser till de gamla, inte längre giltiga resurserna.
Kontrollerna kan automatiskt fånga och hantera förlorade enhetsundantag som genereras av deras CreateResources, Update, Draw, eller RegionsInvalidated-händelsehanterare. Om du anropar Win2D-ritnings-API:er från andra platser (till exempel i en händelsehanterare för pekare eller tangentbordsindata) kan du se nästa avsnitt.
Manuellt hantering av förlorade enheter
Om du använder Win2D utan de inbyggda kontrollerna eller från utanför CreateResources, Update eller Draw händelsehanterare, är det ditt ansvar att fånga upp och rapportera förlorade enhetsundantag. Detta görs med IsDeviceLost(Int32) metoderna och RaiseDeviceLost() :
try
{
DrawStuff();
}
catch (Exception e) where canvasDevice.IsDeviceLost(e.ErrorCode)
{
canvasDevice.RaiseDeviceLost();
}
Genom att anropa RaiseDeviceLost meddelas alla kontroller som delar denna enhet att starta vägen för återställning av förlorade enheter. Om du har fått din enhet från någon annanstans än en kontrollpunkt, använd händelse DeviceLost för att bli informerad när den går förlorad.
Så här testar du förlorad hantering av enheter
Det enklaste sättet att testa att din app gör det rätta som svar på förlorade enheter är att inaktivera din maskinvaru-GPU när appen körs:
- Öppna Enhetshanteraren (Explorer-fönstret –> högerklicka på Den här datorn –> Egenskaper –> Enhetshanteraren)
- Expandera noden "Bildskärmskort"
- Högerklicka på posten för din GPU och klicka på "Inaktivera" Detta kringgår din maskinvaru-GPU, då Windows växlar över till en WARP-programrenderingsenhet, och alla aktiva appar upplever att en enhet går förlorad.
Glöm inte att återanvända din GPU när du har utfört det här testet! Om du vill testa att enheten har förlorats mer än en gång är det bäst att starta om appen varje gång (starta den alltid med GPU:n aktiverad). Att upprepade gånger växla GPU:n till och från medan en app körs orsakar inte på ett tillförlitligt sätt förlorade enheter eftersom den kanske bara fortsätter att använda WARP-programvaruenheten.
När du testar hantering av borttappade enheter vill du förmodligen också se till att appen hanterar dynamiska ändringar i skärmens DPI korrekt.
Windows developer