Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
"Dispositivo perdido" refere-se a uma situação em que o dispositivo gráfico GPU se torna inutilizável para renderização posterior. Isso pode ocorrer devido ao mau funcionamento do hardware da GPU, bugs de driver, atualizações de software de driver ou à mudança do aplicativo de uma GPU para outra. Um dispositivo perdido não pode mais ser usado, e qualquer tentativa de fazê-lo a partir do Win2D lançará uma exceção. Para se recuperar dessa situação, o aplicativo deve criar um novo dispositivo e, em seguida, recriar todos os seus recursos gráficos.
Nem todos os aplicativos se preocupam em tentar recuperar do dispositivo perdido. Esta é uma situação (esperançosamente!) rara, então alguns desenvolvedores apenas deixarão seus aplicativos falharem se isso ocorrer. Para aqueles que preferem lidar com dispositivos perdidos de forma robusta, este artigo explica como.
Dispositivo perdido ao usar controles XAML
Os controles Win2D (CanvasControl, CanvasVirtualControl e CanvasAnimatedControl) tentam manipular automaticamente o dispositivo perdido em nome do aplicativo.
Quando o dispositivo perdido é detetado, esses controles recriam seus CanvasDevice e, em seguida, aumentam o evento CreateResources passando um CanvasCreateResourcesReason de NewDevice. Os aplicativos devem responder a esse evento recriando todos os seus recursos gráficos usando o novo dispositivo e atualizando quaisquer estruturas de dados que possam conter referências aos recursos antigos e não mais válidos.
Os controlos podem capturar e lidar automaticamente com exceções de perda de dispositivo que são lançadas pelos seus gestores de eventos CreateResources, Update, Drawou RegionsInvalidated. Se chamar as APIs de desenho Win2D a partir de outros locais (por exemplo, num gestor de eventos de entrada de ponteiro ou teclado), consulte a próxima seção.
Gestão manual de dispositivo perdido
Se estiver a utilizar o Win2D sem os controlos incorporados ou fora dos processadores de eventos CreateResources, Update ou Draw, é da sua responsabilidade capturar e comunicar exceções de perda de dispositivo. Isto é feito com os IsDeviceLost(Int32) e RaiseDeviceLost() métodos:
try
{
DrawStuff();
}
catch (Exception e) where canvasDevice.IsDeviceLost(e.ErrorCode)
{
canvasDevice.RaiseDeviceLost();
}
Chamar RaiseDeviceLost informa a todos os controles que estão compartilhando este dispositivo para iniciar o caminho de recuperação do dispositivo perdido. Se você recebeu seu dispositivo de outro lugar que não seja um controle, use o evento DeviceLost para ser informado quando ele for perdido.
Como testar a manipulação perdida do dispositivo
A maneira mais fácil de testar se seu aplicativo fará a coisa certa em resposta à perda de dispositivo é desativar a GPU de hardware enquanto o aplicativo está em execução:
- Abra o Gestor de Dispositivos (janela do Explorador -> clique com o botão direito do rato em 'Este PC' -> 'Propriedades' -> 'Gestor de Dispositivos')
- Expanda o nó 'Adaptadores de vídeo'
- Clique com o botão direito do rato na entrada da GPU e clique em 'Desativar' Isto irá ignorar a GPU de hardware, altura em que o Windows muda para um dispositivo de renderização de software WARP e todas as aplicações ativas experimentam um dispositivo perdido.
Não se esqueça de reativar sua GPU depois de realizar este teste! Se você quiser testar o dispositivo perdido mais de uma vez, é melhor reiniciar seu aplicativo sempre (sempre iniciá-lo com a GPU habilitada). Alternar repetidamente a GPU entre ligar e desligar enquanto uma aplicação está em execução não causa de forma fiável a perda de dispositivos, pois pode continuar a usar o dispositivo de software WARP.
Ao testar a gestão de dispositivos perdidos, provavelmente também quererás garantir que a tua aplicação lide corretamente com alterações dinâmicas de DPI de exibição .
Windows developer