Řešení ztráty spojení se zařízením

"Ztracené zařízení" označuje situaci, kdy se grafické zařízení GPU stane nepoužitelným pro další vykreslování. K tomu může dojít kvůli selhání hardwaru GPU, chybám ovladačů, aktualizacím softwaru ovladačů nebo přepnutí aplikace z jednoho GPU na jiný. Ztracené zařízení již nelze použít a jakýkoli pokus o to z Win2D vyvolá výjimku. Aby se aplikace z této situace zotavila, musí vytvořit nové zařízení a pak znovu vytvořit všechny jeho grafické prostředky.

Ne všechny aplikace se snaží obnovit ze ztraceného zařízení. To je (snad!) vzácná situace, takže někteří vývojáři nechají své aplikace spadnout, pokud k tomu dojde. Pro ty, kteří dávají přednost zpracování ztráty zařízení robustním způsobem, tento článek vysvětluje, jak na to.

Při použití ovládacích prvků XAML dojde ke ztrátě zařízení.

Ovládací prvky Win2D (CanvasControlCanvasVirtualControlaCanvasAnimatedControl) se pokusí automaticky zpracovat ztracené zařízení jménem aplikace.

Když dojde ke ztrátě zařízení, tyto ovládací prvky znovu vytvoří své CanvasDevice a potom vyvolají událost CreateResources, která předá CanvasCreateResourcesReasonNewDevice. Aplikace by na tuto událost měly reagovat vytvořením všech grafických prostředků pomocí nového zařízení a aktualizací všech datových struktur, které mohou obsahovat odkazy na staré, již neplatné prostředky.

Ovládací prvky mohou automaticky zachytit a zpracovat výjimky související se ztrátou zařízení, které jsou vyvolány obslužnými rutinami událostí CreateResources, Update, Drawnebo RegionsInvalidated. Pokud voláte rozhraní API kreslení Win2D z jiných míst (například v obslužné rutině události ukazatele nebo vstupu klávesnice), podívejte se na další část.

Ruční řešení ztraceného zařízení

Pokud používáte Win2D bez integrovaných ovládacích prvků nebo mimo CreateResources, Update nebo Draw obslužné rutiny událostí, je vaší povinností zachytit a hlásit výjimky spojené se ztrátou zařízení. To se provádí pomocí IsDeviceLost(Int32) metod a RaiseDeviceLost() metod:

try
{
    DrawStuff();
}
catch (Exception e) where canvasDevice.IsDeviceLost(e.ErrorCode)
{
    canvasDevice.RaiseDeviceLost();
}

Volání RaiseDeviceLost říká všem ovládacím prvkům, které sdílejí toto zařízení, aby zahájily cestu obnovení ztraceného zařízení. Pokud jste zařízení získali odjinud než z kontrolního mechanismu, použijte událost DeviceLost, aby vás informovala o jeho ztrátě.

Jak otestovat řízení ztráty zařízení

Nejjednodušší způsob, jak otestovat, že aplikace udělá správnou věc v reakci na ztrátu zařízení, spočívá v zakázání hardwarového GPU v době, kdy aplikace běží:

  • Otevřete Správce zařízení (okno Průzkumníka –> klikněte pravým tlačítkem na Tento počítač –> Vlastnosti –> Správce zařízení).
  • Rozbalte uzel Grafické adaptéry.
  • Klikněte pravým tlačítkem myši na položku vašeho GPU a klikněte na 'Zakázat'. Tím se obejde vaše hardwarové GPU, v tomto okamžiku se systém Windows přepne na zařízení pro softwarové vykreslování WARP a ve všech aktivních aplikacích může dojít ke ztrátě zařízení.

Po provedení tohoto testu nezapomeňte znovu spustit GPU! Pokud chcete otestovat ztracené zařízení více než jednou, je nejlepší aplikaci pokaždé restartovat (vždy ji spustit s povoleným GPU). Opakované přepínání GPU při spuštění aplikace spolehlivě nezpůsobí ztrátu zařízení, protože může dál používat softwarové zařízení WARP.

Při testování zpracování ztracených zařízení budete pravděpodobně chtít také zajistit, aby se vaše aplikace správně zabývala dynamickými změnami DPI zobrazení.