如何给开源的DUILib支持Accessibility

如何给开源的DUILib支持Accessibility,第1张

最近的工作是给开源的DUILib支持Accessibility, 一些经验记录并分享下。

微软的Accessibility其实Windows平台上一个挺重要的东西, 尽管在国内不受重视,但是如果你的软件要出口欧美,Accessibility是必须的, 不然国外正规单位(政府,学校,大公司等)是禁止采购的。

如果我们的软件用的是Winodws标准控件,一般Accessibility是系统默认内置支持的 (当然这也不是一定的,据我测试系统的Date Time Picker控件是不支持MSAA的)。因为系统标准控件在展现和行为上的一些限制以及自绘的复杂性,越来越多的软件使用DirectUI技术,关于使用DirectUI的理由,更多参见<<如何让窗口控件半透明 >>和<< 软件换肤的原理 >>

国内最有名的的DirectUI界面库当然是 开源的 DUILib (尽管这套库已停止更新), 实际上我以前在自己业余写点东西时, 也参考过它, 具体参见<< 开源一套DirectUI界面库 >>。对于开源的DUILib, 个人觉得它有挺多优点, 也有挺多缺点, 我们重点说缺点, 因为这是我们改进的方向。

1。扩展性差

DUILib只实现了一些基本的控件,好的DirectUI库可以通过基本控件组合来轻松实现复杂控件,而要达到这个效果, 很多时候我们需要拦截子控件的消息, 尽管DUILib提供了delegate机制来子类化子控件, 但是这样消息拦来拦去实在太不方便了,很多时候自己都转晕了。个人觉的这里我们可以引入WPF的隧道和冒泡机制, 这个东西对DirectUI界面库实在太重要了。

2。不支持Layered窗口

要完美支持Layered窗口,意味着所有的Render全都要支持Alpha通道, DUILib使用GDI, 如果没有特殊处理,意味着没法完美支持Layered窗口, 我这篇也谈到过这个问题<< 如何基于纯GDI实现alpha通道的矢量和文字绘制 >>。

3。大数据时性能不行

DUILib很多时候只适合做些简单的界面,本身控件基类很庞大,数据量方面对于几百条数据还行,但是对于成千上万条数据就吃不消了,这时我们需要引入WPF的虚表机制。

4。不支持图文排版

尽管DUILib支持简单的HTML排版, 但是毕竟太简单,如果我们要在QQ那样的聊天窗口里引入就吃不消了, 另外它渲染HTML那个代码我是吃不消看的。

5 基本不支持Accessibility

6。其他

接口和属性定义太随意, 采用导出类的方式也不好扩充, 渲染方面最好能在GDI/GDI+/Direct2D方面进行切换,最好将核心控件和扩展控件分离开, 编辑器也太简陋。

今天我们重点说Accessibility,一个界面库要完整支持Accessibility, 要包括太多东西 (具体可以参见控制面板里的"轻松访问中心"),我估计只有微软自己做的到(比如WPF), 这也是很多人推荐系统标准控件而排斥DirectUI的理由。 我们说的Accessibility很多时候只是简化版, 下面我们说重点的几条。

1。键盘支持

键盘支持简单来说就是即使我没有鼠标, 我也能通过通过键盘完成所有 *** 作。它主要包括键盘导航和控件的键盘支持。键盘导航主要是指我可以通过一些热键(如F6)可以在不同窗口(Panel)之间进行焦点切换, 我可以通过Tab/Shift+Tab在窗口内不同控件之间进行焦点导航。控件的键盘支持也是很多国内DirectUI库所缺失的,比如:

Dialog: Enter执行默认, ESC退出并关闭

Button:空格执行

CheckBox:空格取反

Radio:空格取反,上下左右键切换选中项

TabCtrl:焦点选中时上下左右切换, 焦点没选中时Ctrl+Tab/Ctrl+Tab+Shift切换Tab页

Menu:上下左右导航,Enter执行, ESC取消关闭, 具体参见<< DirectUI中模态对话框和菜单的原理 >>

总之,DUILib在键盘支持这块已经做了不少工作,但是还有挺多事要做,每个控件都要完整支持键盘是个很精细的活。

2。读屏软件和自动化测试的支持。

ScreenReader(读屏器)主要是给盲人用的, 程序可以实时的把获得焦点的控件和系统发生的事件播报出来, 很多读屏软件都需要收费,还好Win7之后系统已自带读屏软件(控制面板\轻松访问\轻松访问中心\启动讲述人)。自动化测试时也需要工具能够理解我们界面中包含的元素类型和位置, 以及模拟 *** 作事件等。

DirectUI要支持读屏和自动化测试一般有2种方式, MSAA和UI Automation。 MSAA是比较古老的方式,主要就是实现IAccessible接口;UI Automation是微软特意给WPF新增加的。MSAA出来的时候还是Win95, 因为历史原因有一些限制, 比如不支持Text控件,没法描述复杂控件等, 所以微软后来引入了UI Automation, 具体参见<< Windows GUI自动化测试技术的比较和展望 >>。

MSAA最大的优点是稳定, 所以我在DUILib里采用MSAA来实现ScreenReader的支持。简单说下几个关键点:

(a) 每个控件啊实现IAccessible接口的Proxy对象尽量独立,里面保存一个控件指针的引用,这样即使控件销毁了,Proxy对象可以依旧存在(系统仍可能会访问这个对象)。

(b) 按照控件的层次体系,实现每种控件的Proxy类(实现IAccessible接口)。

(c) WM_GETOBJECT请求OBJID_CLIENT时返回根节点的Proxy对象, 焦点变化时通知触发事件NotifyWinEvent(EVENT_OBJECT_FOCUS, m_hWndPaint, (LPARAM)m_pFocus , CHILDID_SELF), 窗口收到 WM_GETOBJECT消息时根据ObjectID(这里是控件指针)找到该控件, 然后返回该控件的Proxy。 (这是关键,这个问题郁闷了我好久的)

3。高对比(high contrast)的支持

高对比,主要是给色盲用,这个东西一般自绘程序都不会支持, 即使你是用标准控件,因为 一般会用自己漂亮的和色彩来表现界面, 高对比实现 的关键点是你在画每个元素时要通过GetSystemColor来获取颜色。据我测绘除了微软自己的程序, 其他越是漂亮的软件越是不支持高对比(即使如QQ和Chrome)。

4。高DPI的支持

随着Surface Pro和高分辨率设备的流行,程序对高DPI的支持正变得越来越重要, 具体参见<< 关于Windows高DPI的一些简单总结 >>。传统的基于标准控件的程序要支持高DPI是在太难了,所以微软才有了DWM虚拟化。但是DirectUI对高DPI的支持有着天然的优势, 我们完全可以在界面库这层让程序完美支持高DPI, 界面的渲染主要是文字, 矢量 和, 文字和矢量完全可以通过无损缩放绘画实现,图像可以通过适当缩放和换图来实现。

总结下,尽管我N次吐槽基于GDI的DirectUI界面库会随着XP的淡出而逐渐失去市场, 但是实际工作中还是要经常和GDI打交道,外面招聘单位还是有不少Windows客户端的开发岗位。 在这"移动互联和"Web前端"横行的"大数据"时代,很多同事开始向移动App和大数据转型, 尽管这几年PC客户端的开发人员是只出不进, 但是只要Windows存在一天,我们的工作就还是有价值的

转载

显卡问题,调低你的分辨率;

1分辨率、显示模式、比例、DirectX版本不言自明,值得一提的是,如果你的运行帧数有所浮动的话,建议使用窗口模式或者无框线窗口模式,在窗口模式下Windows会自动为画面使用三重缓冲,可以减少帧数浮动时产生的画面撕裂现象。

2FXAA:目前最为常见的后处理抗锯齿,速度极快,几乎没有性能损失,效果就只能说是一般了,建议开着,没有坏处;

3MSAA:显存消耗的大户,在1080p分辨率下关闭和2X的显存消耗接近200MB之多,建议3GB以上显存的中高端显卡开启,3GB显存以下的就不要凑热闹了;

4TXAA:NVIDIA显卡专属的后处理强化抗锯齿,只有在MSAA开启的情况下才能启用,如果你打算打开MSAA,这个也可以打开;

5垂直同步:开启之后帧数上限会锁定到显示器的刷新率上限,对大多数玩家来说都是60,开启即可;

6人口密集程度和人口多样化程度的作用很好理解,这二者的性能冲击主要在于CPU与内存占用,有i5和同等性能CPU的玩家可以开到最高,i3等中低端CPU用户建议调低;

SRP中实现MSAA很简单。我们先在 CustomRenderPipelienAsset 中添加对应的枚举,MSAA默认关闭:

在 CameraRenderer 中,我们和后处理效果一块使用即可。在 Setup 中,如果开启后处理模块,我们设置MSAA采样数,并将其应用到我们的渲染目标的声明,位于最后一个参数中:

默认采样数为1,如果设置了MSAA,那么使用对应的采样数。

关闭MSAA和4xMSAA:

目前的MSAA只处理了颜色缓冲,如果想应用于深度我们需要分开设置。

注意MSAA想得到较好的效果是比较耗能的,之后会尝试增加TAA之类的抗锯齿方法。

缩放渲染可用于调整渲染的分辨率。在 CustomRenderPipelienAsset 中添加相应的浮点变量:

在 CameraRenderer 中,我们添加一个布尔变量来确定是否使用缩放渲染:

Render 中确定是否使用缩放:

注意在编辑器窗口中我们就不使用缩放了,以免耗能,在 PrepareForSceneWindow 中将布尔值设为false:

如果设置缩放渲染的话,就使用缩放数值调整缓冲大小,否则使用原摄像机的视口大小即可:

在 Setup 中应用,调整渲染目标的缓冲大小:

在 Render 中,我们也将缓冲大小传入 postFXStackSetup 中。对于发光效果,我们可以设置一个布尔值来控制是否引用缩放,在 PostFXSettings 中设置 BloomSettings 结构体:

DoBloom 中,根据是否忽略缩放来调整缓冲大小:

对应的地方应用即可。

对于后处理,我们额外添加一个缩放pass来进行渲染缩放:

一个很简单的复制pass。

在 DoColorGradingAndToneMapping 的最后,根据缓冲大小的设置决定使用不同的pass:

05和2:

是开启之后能在游戏中画面进行抗锯齿处理,让游戏人物等东西的边缘看着更柔和,更平滑,画面变得更加精致的下过。

开发者模式提高游戏性能中的(强制启用4xMSAA)即多重取样抗锯齿模式。强制4x MSAA,即启用四倍抗锯齿。 缺点:费电和占用内存。 4x MSAA是一种快速的抗锯齿功能,类似于计算机图形卡fxaa。 启用此功能将改善图像质量,但会降低性能。

技术模型

其技术模型为,UI程序可以暴露出一个Interface,以便另一个程序可以控制。 MSAA技术的初衷是使残疾人更容易使用Windows程序。MSAA暴露出来的Interface叫做 IAccessible。

例如,盲人看不到窗口,但是盲人可以通过USB屏幕阅读器连接到计算机。 屏幕阅读器通过UI程序公开的界面可以获取程序信息,并将其以盲文或其他形式传递给盲人。 MSAA提供了这种方便的功能,UI自动测试自然可以借鉴这项技术。

以上就是关于如何给开源的DUILib支持Accessibility全部的内容,包括:如何给开源的DUILib支持Accessibility、GTA5游戏画面模糊 聊天通知清晰怎么办、Unity自定义SRP(十四):抗锯齿和缩放渲染等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10147169.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存