У меня есть CanvasControl в приложении UWP, и я заметил, что когда я оставляю свой Surface в покое на некоторое время, и он автоматически переходит в спящий режим, CanvasControl больше не работает после возобновления. Ранее нарисованное растровое изображение теперь пустое.

Я попытался смоделировать приостановку / возобновление в Visual Studio 2015, но, похоже, это не вызывает проблем. Он возобновляется нормально.

У меня есть ощущение, что это связано с событием CanvasDevice.DeviceLost, и хотя я справляюсь с этим с помощью события CanvasControl.CreateResources, я не могу найти способ легко его протестировать.

Я пробовал следующее:

// This throws an exception. Not allowed to do this.
myCanvas.Device.RaiseDeviceLost(); 

// and this doesn't report a device lost, but myCanvas becomes unusable.
myCanvas.Device.Dispose();

Есть ли способ программно вызвать событие CanvasDevice.DeviceLost? Как я могу это подделать?

4
Laith 25 Фев 2016 в 03:22

2 ответа

Лучший ответ

Невозможно вызвать событие потери устройства с помощью API, но есть инструмент командной строки, который вы можете использовать:

DXCap.exe -forcetdr

Необходимая вам версия DXCap является частью пакета графических инструментов для Windows 10, для сборки Win10 10586 или более поздней: https://msdn.microsoft.com/en-us/library/mt125501 .aspx # InstallGraphicsTools

После установки VSGD вы можете найти DXCap в каталоге windows \ system32.

К сожалению, похоже, что этот параметр (пока) не задокументирован, но из командной строки:

  -forcetdr          Don't capture or replay, but simply force a GPU Timeout
                     Detection and Recovery event, then exit.
10
Simon 25 Фев 2016 в 02:26

То, что описал @Simon, задокументировано здесь, внизу страницы:

Обработка сценариев удаления устройства в Direct3D 11

Прямая цитата по ссылке выше:

Командная строка разработчика Visual Studio поддерживает инструмент командной строки dxcap для захвата и воспроизведения событий Direct3D, связанных с диагностикой графики Visual Studio. Вы можете использовать параметр командной строки «-forcetdr» во время работы вашего приложения, что вызовет событие обнаружения и восстановления тайм-аута графического процессора, тем самым запустив DXGI_ERROR_DEVICE_REMOVED и позволив вам протестировать код обработки ошибок.

0
Zingam 8 Янв 2017 в 07:53