Win2D 官方文章系列翻译 - 处理设备丢失
本文为个人博客备份文章,原文地址:
http://validvoid.net/win2d-handling-device-lost/
“设备丢失”是指 GPU 设备失效无法继续进行渲染的情况。GPU 硬件故障、驱动程序缺陷、驱动程序软件更新或者从一个 GPU 切换到另一个都可能导致此问题。丢失的设备无法使用,此时任何尝试使用设备的 Win2D 都会引发异常。要解决这一问题,应用必须创建新设备再重新创建所有图形资源。
并非所有应用都需要操心如何解决设备丢失的情况。设备丢失是一种比较少见的情况(但愿如此),所以某些开发者就任由应用在此类情况发生时崩溃了。而本文正是为另一些希望应用足够健壮,能够处理设备丢失问题的开发者准备的。
使用 XAML 控件时设备丢失的处理
Win2D (CanvasControl, CanvasVirtualControl and CanvasAnimatedControl)控件能够代替应用自动应对设备丢失的情况。
当检测到设备丢失,这些控件会重建它们的 CanvasDevice
并触发 CreateResources
事件,传递值为 NewDevice 的 CanvasCreateResourcesReason 类型枚举作为参数。应用应当在该事件的处理逻辑中使用新的设备重建所有图形资源,并更新任何可能包含对旧有失效资源引用的数据结构。
Win2D 控件能够自动捕获并处理在其 CreateResources
、Update
或 Draw
事件处理逻辑中抛出的设备丢失异常。如果你在其它位置调用了 Win2D 绘图 API (比如在鼠标或键盘输入事件处理程序中),请参阅下一节的内容。
手动处理设备丢失
如果你并没有使用 Win2D 的内建控件,或在 CreateResources
、Update
或 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 的动态改变。
译注:WARP 全拼 Windows Advanced Rasterization Platform,即Windows 高级光栅化平台,详情可参阅"Windows Advanced Rasterization Platform (WARP) Guide" ↩
Win2D 官方文章系列翻译 - 处理设备丢失的更多相关文章
- Win2D 官方文章系列翻译 - DPI (每英寸点数)和 DIPs(设备独立像素)
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-dpi-dips/ 本文旨在解释物理像素与设备独立像素(DIPs, device independent pi ...
- Win2D 官方文章系列翻译 - 避免内存泄漏
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-avoiding-memory-leaks/ 在托管 XAML 应用中使用 Win2D 控件时,必须谨慎处理对 ...
- Win2D 官方文章系列翻译 - 幕后绘制
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-offscreen-drawing/ 应用有时需要将图形绘制到并不立即显示的目标上.此类绘制动作被称作“幕后绘 ...
- Win2D 官方文章系列翻译 - 预乘 Alpha
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-premultiplied-alpha/ 在计算机绘图中有两种表示颜色值不透明度的方法.Win2D 中两种方法 ...
- Win2D 官方文章系列翻译 - 像素格式
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-pixel-formats/ DirectXPixelFormat 枚举 包含了 Direct3D 和 DXG ...
- Win2D 官方文章系列翻译 - 与 Direct2D 互操作
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-interop-with-direct2d/ Win2D 作为 Direct2D 的上层实现,支持与其进行双向 ...
- Win2D 官方文章系列翻译 - 调整控件分辨率
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-choosing-control-resolution/ 本文旨在讲解如何配置 Win2D XAML 控件使用 ...
- NLog文章系列——如何配置NLog(转)
NLog使用方法 作者:Jaros?aw Kowalski <> 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/conf ...
- AngularJS系列-翻译官网
公司之前一直用的Web前台框架是Knockout,我们通常直接叫ko,有看过汤姆大叔的KO系列,也有在用,发现有时候用得不太顺手.本人是会WPF的,所以MVVM也是比较熟悉的,学ko也是很快就把汤姆大 ...
随机推荐
- LinearLayout属性baselineAligned的作用及baseline
相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned呢? Android官方文档是这么描述的:
- bzoj2734 集合选数
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- Python 创建和发布安装函数模块
1. create dir "nester" under C:\Users\eric\AppData\Local\Programs\Python\Python35-32\ 2. c ...
- 恢复ext4文件系统superblock
恢复ext4文件系统superblock 1. Create ext4 文件系统. [root@localhost ~]# mkfs.ext4 /dev/vdb1 [root@localhost ~] ...
- WINDOWS黑客基础(4):查找进程运行的基址
从WINDOWS VISITA开始以后,windows已经开始支持随机基址的关系,也就是说以前我们的进程基址都是从0x40000开始的,如果一个变量在我们第一次运行的时候地址为0x50000,那么以后 ...
- C3P0数据库连接池的相关bug解决
数据库连接池的几个常见bug: 1.警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76c7022e -- ...
- PUA
约会技巧 kino技巧 被拒绝的应对方法 (1)一般约会7个小时后,就能带女生回家 (2)点菜时多点一点,以回家放菜为名 (3)理由要文雅 (4)开酒店的理由 第一时间触碰测试 (1)第一次约会要第一 ...
- U3d中实现A*寻路,附源文件
图片看不清楚,请点击看大图 http://pan.baidu.com/s/1pKwmOYn 写了好多,没保存,哎哎哎 空格键开始移动
- DBA_Oracle冷备份案例脚本本法(案例)
2014-08-10 Created By BaoXinjian
- NeHe OpenGL教程 第二十课:蒙板
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...