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

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. LinearLayout属性baselineAligned的作用及baseline

    相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned呢? Android官方文档是这么描述的:

  2. bzoj2734 集合选数

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  3. Python 创建和发布安装函数模块

    1. create dir "nester" under C:\Users\eric\AppData\Local\Programs\Python\Python35-32\ 2. c ...

  4. 恢复ext4文件系统superblock

    恢复ext4文件系统superblock 1. Create ext4 文件系统. [root@localhost ~]# mkfs.ext4 /dev/vdb1 [root@localhost ~] ...

  5. WINDOWS黑客基础(4):查找进程运行的基址

    从WINDOWS VISITA开始以后,windows已经开始支持随机基址的关系,也就是说以前我们的进程基址都是从0x40000开始的,如果一个变量在我们第一次运行的时候地址为0x50000,那么以后 ...

  6. C3P0数据库连接池的相关bug解决

    数据库连接池的几个常见bug: 1.警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76c7022e -- ...

  7. PUA

    约会技巧 kino技巧 被拒绝的应对方法 (1)一般约会7个小时后,就能带女生回家 (2)点菜时多点一点,以回家放菜为名 (3)理由要文雅 (4)开酒店的理由 第一时间触碰测试 (1)第一次约会要第一 ...

  8. U3d中实现A*寻路,附源文件

    图片看不清楚,请点击看大图 http://pan.baidu.com/s/1pKwmOYn   写了好多,没保存,哎哎哎 空格键开始移动

  9. DBA_Oracle冷备份案例脚本本法(案例)

    2014-08-10 Created By BaoXinjian

  10. NeHe OpenGL教程 第二十课:蒙板

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