本文为个人博客备份文章,原文地址:

http://validvoid.net/win2d-handling-device-lost/

“设备丢失”是指 GPU 设备失效无法继续进行渲染的情况。GPU 硬件故障、驱动程序缺陷、驱动程序软件更新或者从一个 GPU 切换到另一个都可能导致此问题。丢失的设备无法使用,此时任何尝试使用设备的 Win2D 都会引发异常。要解决这一问题,应用必须创建新设备再重新创建所有图形资源。

并非所有应用都需要操心如何解决设备丢失的情况。设备丢失是一种比较少见的情况(但愿如此),所以某些开发者就任由应用在此类情况发生时崩溃了。而本文正是为另一些希望应用足够健壮,能够处理设备丢失问题的开发者准备的。

使用 XAML 控件时设备丢失的处理

Win2D (CanvasControlCanvasVirtualControl and CanvasAnimatedControl)控件能够代替应用自动应对设备丢失的情况。

当检测到设备丢失,这些控件会重建它们的 CanvasDevice 并触发 CreateResources 事件,传递值为 NewDevice 的 CanvasCreateResourcesReason 类型枚举作为参数。应用应当在该事件的处理逻辑中使用新的设备重建所有图形资源,并更新任何可能包含对旧有失效资源引用的数据结构。

Win2D 控件能够自动捕获并处理在其 CreateResourcesUpdate 或 Draw 事件处理逻辑中抛出的设备丢失异常。如果你在其它位置调用了 Win2D 绘图 API (比如在鼠标或键盘输入事件处理程序中),请参阅下一节的内容。

手动处理设备丢失

如果你并没有使用 Win2D 的内建控件,或在 CreateResourcesUpdate 或 Draw 事件处理逻辑之外调用了 Win2D 绘图 API,那么你就需要手动捕获并报告设备丢失异常。这可以通过 IsDeviceLost(Int32) and RaiseDeviceLost() 方法实现:

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

调用 RaiseDeviceLost 方法会通知所有使用当前设备的控件启动设备丢失处理逻辑。如果你是从别的某个地方获取的该设备,你需要通过 DeviceLost 事件在设备丢失时进行响应。

如何测试设备丢失的处理情况

要检测你的应用是否正确处理了设备丢失的情况,最简单的办法就是在应用运行期间关闭你的硬件 GPU:

  • 打开 设备管理器 (桌面 -> 右键单击 此电脑 -> 属性 -> 设备管理器)
  • 展开 显示适配器 节点
  • 右键单击你的 GPU 设备条目,选择 禁用

这样 Windows 就会绕过你的 硬件 GPU,切换到 WARP1 软件渲染设备进行显示渲染,而这期间所有活动应用都会遭遇设备丢失的情况。

别忘记在测试完成后重新启用你的 GPU!如果你想要多次测试设备丢失的情况,最好每次测试都重启应用(启动时确保 GPU 开启)。在应用运行期间反复开关 GPU 并不一定会反复引发设备丢失,因为在此期间系统可能持续使用 WARP 软件设备进行渲染。

在测试应用处理设备丢失的同时,最好也确保应用能够正确处理显示设备 DPI 的动态改变。


  1. 译注:WARP 全拼 Windows Advanced Rasterization Platform,即Windows 高级光栅化平台,详情可参阅"Windows Advanced Rasterization Platform (WARP) Guide" 

Win2D 官方文章系列翻译 - 处理设备丢失的更多相关文章

  1. Win2D 官方文章系列翻译 - DPI (每英寸点数)和 DIPs(设备独立像素)

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-dpi-dips/ 本文旨在解释物理像素与设备独立像素(DIPs, device independent pi ...

  2. Win2D 官方文章系列翻译 - 避免内存泄漏

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-avoiding-memory-leaks/ 在托管 XAML 应用中使用 Win2D 控件时,必须谨慎处理对 ...

  3. Win2D 官方文章系列翻译 - 幕后绘制

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-offscreen-drawing/ 应用有时需要将图形绘制到并不立即显示的目标上.此类绘制动作被称作“幕后绘 ...

  4. Win2D 官方文章系列翻译 - 预乘 Alpha

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-premultiplied-alpha/ 在计算机绘图中有两种表示颜色值不透明度的方法.Win2D 中两种方法 ...

  5. Win2D 官方文章系列翻译 - 像素格式

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-pixel-formats/ DirectXPixelFormat 枚举 包含了 Direct3D 和 DXG ...

  6. Win2D 官方文章系列翻译 - 与 Direct2D 互操作

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-interop-with-direct2d/ Win2D 作为 Direct2D 的上层实现,支持与其进行双向 ...

  7. Win2D 官方文章系列翻译 - 调整控件分辨率

    本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-choosing-control-resolution/ 本文旨在讲解如何配置 Win2D XAML 控件使用 ...

  8. NLog文章系列——如何配置NLog(转)

    NLog使用方法 作者:Jaros?aw Kowalski <> 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/conf ...

  9. AngularJS系列-翻译官网

    公司之前一直用的Web前台框架是Knockout,我们通常直接叫ko,有看过汤姆大叔的KO系列,也有在用,发现有时候用得不太顺手.本人是会WPF的,所以MVVM也是比较熟悉的,学ko也是很快就把汤姆大 ...

随机推荐

  1. Linux下nice/renice命令小结

    1. nice命令 内核根据进程的nice值决定进程需要多少处理器时间. nice值的取值范围是是: -20到20. 一个具有-20 的 nice 值的进程有很高的优先级. 一个 nice 值为 20 ...

  2. 单点登录filter根据redis中的key判断是否退出

    package com.ailk.biapp.ci.localization.cntv.filter; import java.io.IOException; import java.util.Has ...

  3. NeHe OpenGL教程 第四十二课:多重视口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. xhprof 安装使用

    1.安装扩展 windows下把 xhprof.dll 放到extensions目录下 修改配置文件 [xhprof] extension=xhprof.so; ; directory used by ...

  5. python(14)类,方法,对象,实例

    类: 简单来说就是一个函数的集合,在这个集合里面你定义了很多个函数: 方法:其实就是你定义的这些函数. 对象:简单来说就是自身具有多个属性(也可以说是子变量)的变量而已. 在下面的例子中class P ...

  6. 获取mysql数据表中的列名

    select COLUMN_NAME from information_schema.columns where table_name='table_name' DESCRIBE table_name ...

  7. MySQL利用Navicat导出数据字典

    这里算是一个小技巧 利用mysql的information_schema中的COLUMNS表 和navicat中的导出功能实现快速导出数据字典 CREATE TEMPORARYTABLE `COLUM ...

  8. git fetch和git pull(转载)

    From:http://www.tech126.com/git-fetch-pull/ Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到 ...

  9. Linux 链接(转载)

    来源:http://www.cnblogs.com/sonic4x/archive/2011/08/05/2128543.html 1.Linux链接概念Linux链接分两种,一种被称为硬链接(Har ...

  10. Linux网络流量监控工具-iftop

    参考:http://blog.163.com/jgh2008@126/blog/static/28596246201092081139283/ 一.获得和安装iftop Centos:yum inst ...