Win2D 官方文章系列翻译 - 处理设备丢失

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

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" ?
时间: 2024-10-10 06:48:58

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

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

本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-offscreen-drawing/ 应用有时需要将图形绘制到并不立即显示的目标上.此类绘制动作被称作“幕后绘制”或“绘制到纹理”.当应用需要将绘制操作输出保存到一个文件.返回为一个像素数组或留作后续操作的输入源时,常需要进行这种幕后绘制. 通过使用 Win2D 中的 CanvasRenderTarget 可以轻松实现以上场景. CanvasRenderTarget 派生自 CanvasBitmap ,包含

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

本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-choosing-control-resolution/ 本文旨在讲解如何配置 Win2D XAML 控件使用的分辨率.下文将介绍如何: 使 Win2D 控件运行在固定的分辨率. 通过调整控件 DPI 减少渲染像素数以增强性能. 分辨率与控件缩放 本文中所用的“分辨率”一词,是指位图的尺寸(高宽). Win2D XAML 控件绘制的对象均有分辨率和 DPI 这两项属性.对象的 DPI 指示了绘制时其构成像素

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

本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-dpi-dips/ 本文旨在解释物理像素与设备独立像素(DIPs, device independent pixels)之间的区别,以及 Win2D 如何处理 DPI (dots per inch/每英寸点数). Win2D 被设计为可以自行感知设备环境,以便在各种高低不同 DPI 的设备上呈现正确的视觉表现,故多数应用可以忽略 DIPs 和 DPI 之间的区别.如果你的应用有更多特定需求,或者你希望自行定

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

本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-premultiplied-alpha/ 在计算机绘图中有两种表示颜色值不透明度的方法.Win2D 中两种方法均有所采用.本文旨在解释两种方法之间的区别以及其各自的使用场景. 直接 Alpha (Straight alpha) 当使用直接,亦即线性 Alpha 时: RGB 值指定绘制目标的颜色 Alpha 值指定绘制目标的质密程度 在该方法中,RGB 和 Alpha 通道各自独立发挥作用.它们可以在不互相

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

NLog使用方法 作者:Jaros?aw Kowalski <> 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/config.html 更多关于NLog的中文文章,请参考<NLog文章系列>. NLog支持以多种不同方式配置,目前同时支持直接编程和使用配置文件两种方法.本文将对目前支持的各种配置方式作详细描述. 日志配置 通过在启动的时候对一些常用目录的扫描,NLog会尝试使用找到的配置信息进行自动的自我配置.当你

AngularJS系列-翻译官网

公司之前一直用的Web前台框架是Knockout,我们通常直接叫ko,有看过汤姆大叔的KO系列,也有在用,发现有时候用得不太顺手.本人是会WPF的,所以MVVM也是比较熟悉的,学ko也是很快就把汤姆大叔的文章系列看完了,但是ko有时候会有意想不到的问题,同事也有这样的反应,所以就度娘了一下.就找到了AngularJS和KO的对比文章<從Knockout到AngularJS>,看了之后不明觉厉.其实早在AngularJS刚刚问世的那年,因为我订阅了博友--梦想天空(山边小溪)的博客(这里得特别感

图像融合文章系列汇总

这是实验室项目的资料汇总,一方面便于自己整理,理清思路,另一方面让大家对图像融合有个大概的了解.以后项目还没有完结,以后还会有所补充. 图像融合文章系列汇总: 图像融合(一)-- 概述 图像融合(二)-- 简单加权融合 图像融合(三)-- 拉普拉斯金字塔 图像融合(四)-- 对比度金字塔 图像融合(五)-- 梯度金字塔 图像融合(六)-- 小波融合

Docker在Linux/Windows上运行NetCore文章系列

原文:Docker在Linux/Windows上运行NetCore文章系列 Windows系列 因为Window很简单,VS提供界面化配置,所以只写了一篇文章 Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用 Linux(ubuntu 16.04) Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 Docker在Linux上运行NetCore系列(二)把本地编译好的镜像发布到线上阿里云仓库 Docker

Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)

这几个月一直在学习iOS开发,把Android放在一旁耽搁了很久,是时候温故而知新了. 说点篇外话,这几天在看Developer的官方文档,关于Material Design又了解了一下. Material早在2014年的GoogleIO大会就已经被谷歌推出了,但是市场上采用这种新的设计方案的APP确是少之又少,国外倒是跟进的很快,国内几乎没有任何进展,纵观国内各大公司的移动APP,很少会“与时俱进”的采用Google推出的新系统的设计方案. 不过这原因由来已久了,因为安卓系统的版本分布太过零散