如何使用Win2D模拟DeviceLost事件?

时间:2016-02-25 00:22:44

标签: c# win-universal-app win2d

我在UWP应用程序中有一个CanvasControl,我注意到当我单独离开Surface一段时间后它会自动进入睡眠状态,恢复后CanvasControl不再有效。以前绘制的位图现在是空白的。

我尝试在Visual Studio 2015中模拟Suspend / Resume,但这似乎不会导致问题。它恢复正常。

我觉得它与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事件?我该如何伪造它?

2 个答案:

答案 0 :(得分:6)

使用API​​触发设备丢失事件是不可能的,但您可以使用命令行工具:

DXCap.exe -forcetdr

您需要的DXCap版本是适用于Windows 10的图形工具包的一部分,适用于Win10版本10586或更高版本: https://msdn.microsoft.com/en-us/library/mt125501.aspx#InstallGraphicsTools

安装VSGD后,您可以在windows \ system32目录中找到DXCap。

不幸的是,看起来这个选项尚未记录,但是来自命令行:

  -forcetdr          Don't capture or replay, but simply force a GPU Timeout
                     Detection and Recovery event, then exit.

答案 1 :(得分:0)

@Simon所描述的内容将在页面底部记录:

Handle device removed scenarios in Direct3D 11

直接引用上面的链接:

  

Visual Studio的Developer Command Prompt支持命令行工具'dxcap',用于与Visual Studio Graphics Diagnostics相关的Direct3D事件捕获和回放。您可以在应用程序运行时使用命令行选项“-forcetdr”,这将强制执行GPU超时检测和恢复事件,从而触发DXGI_ERROR_DEVICE_REMOVED并允许您测试错误处理代码。