• 首页
  • 关于
  • 标签
  • 归档
  • 欢迎投稿
  • 跳至内容

    V23 Beta DDE Wayland解读

    在 V23 beta 版本中,DDE 试验性的开启了 Wayland 的支持,允许用户在 Wayland 协议下的桌面工作环境启动 。本篇文章会向大家介绍一下 Wayland 是什么,我们尝试做了什么改变,以及 DDE Wayland 未来会支持哪些新特性。(注:单独提出 Wayland, 通常和 Wayland 合成器、Wayland 服务器、显示服务器被视为同一个内容;X Window System 和 X11 也被视为同一个内容。)

    什么是 Wayland?

    Wayland 是一个通信协议,规定了显示服务器与客户端之间的通信方式,而使用这个协议的显示服务器称为 Wayland Compositor。Wayland 只专注于图形,并希望使用其他库与输入硬件进行通信,以降低自身的复杂度。Wayland 最大的好处也是大家都推崇的原因,那就是 Wayland 在设计上会考虑安全,例如默认不允许窗口获取其他窗口的数据,合成器和窗口管理器的合并也降低了对系统资源的消耗。

    Wayland 与 X Window System 有什么不同?

    Wayland 与 X Window System 的最大不同在于,Wayland 与 X Window System 的最大不同在于,它的窗口管理器和 Wayland Server 在同一个进程,并且客户端能够通过 EGL 以及一些 Wayland 特定的 EGL 扩充组件直接在显示内存中绘制自己的缓冲区。 窗口管理器简化成显示管理服务,专门负责绘制那些屏幕上的程序。 这比 X Window System 中的窗口管理器要更简单、高效。

    Wayland 协议有哪些组成?

    1.协议概述

    Wayland 协议被描述为异步面向对象协议。协议是异步的,这意味着不必等待回复或者响应 ACK,避免了往返时间并提高性能。协议封装为面向对象的设计,则是面向对象的设计方式,能很好的对服务器上不同窗口数据及接口进行封装。

    Wayland 合成器可以定义和公开自己的附加接口,被称为扩展协议,不同的 Wayland 会提供功能完全不同,甚至功能相反的协议,这带来了很大灵活性,但使用客户端时需要自行判断。

    2.协议架构

    Wayland 协议是一种“客户端 —— 服务器”模型,客户端是请求在屏幕上显示画面的图形应用程序,服务器是控制应用程序显示在屏幕上的管理程序。Wayland 参考实现被设计成两层协议,既:

    • 下层协议:处理客户端和服务器之间的进程间通信,以及在内部的数据封装处理。
    • 上层协议:处理客户端和服务器交换的数据,以实现窗口系统的基本功能,这一层被实现为异步面向对象协议。 下层协议是使用 C 语言开发的,而上层协议是根据 XML 格式的协议描述文件自动生成,每当 XML 协议的描述发生变化时,就可以重新生成该协议的源代码,这使得协议非常灵活、可扩展性好且防止出错。

    如下 Wayland 工作原理图:

    wayland.png

    以下对应图中所标编号作说明:

    Linux 内核中的 evdev 模块接收事件并将它们发送到 Wayland 合成器。

    Wayland 合成器查看场景图并确定哪个窗口应接收事件。场景图对应于屏幕上显示的内容,Wayland 合成器显示对应用事件的场景图中元素的转换。因此,Wayland 合成器可以反向变换以找到正确的窗口,并将屏幕上的坐标转换为窗口中的坐标。

    当客户端收到事件时,Wayland 的客户端只需通过 EGL 渲染并向合成器发送请求以通知更新的范围即可。

    Wayland 合成器 从客户端收集更改请求并重新配置屏幕。 然后,合成器直接发出 ioctl 让 KMS 重绘屏幕。

    当了解了 Wayland 相关基本介绍之后,基于它我们在 DDE 上将会作哪些适配功过呢?将从以下几个方面说一下我们在 Wayland 技术预览版里面所做的适配工作。

    DDE 适配 Wayland 都做了哪些工作

    DDE 原本设计为在 X11 协议下工作,很多组件直接或间接依赖 X11 的接口,多数组件依赖的功能并没有在 XWayland 中提供,所以就需要进行一些修改。

    首先在 Qt 插件中实现和 Wayland 特定性相关的功能,Qt 提供了一个 Wayland Shell Integration 的插件,允许我们在这里调用 DDE Wayland 合成器提供的扩展协议。

    Qt 已提供核心协议的适配,所以 DDE 只需要在现有框架下实现扩展协议即可。

    目前 DDE 提供的扩展协议有以下几个方面:

    • 设置圆角窗口
    • 请求获取窗口数据(截图权限)
    • 划分工作区可用区域 DTK 程序可以通过设置窗口的属性,或者使用 DTK 提供的平台接口,即可调用扩展的 Wayland 协议,非 DTK 程序则需要手动使用扩展协议的 XML 文件进行代码生成调用。

    DDE Wayland 未来会支持什么特性?

    1.HDR 支持

    高动态范围(HDR)是比平时更高的动态范围。HDR 的内容过于深入,在这里只简单的进行说明。

    HDR 可以保存更多的内容信息,在支持 HDR 的屏幕上观看 HDR 的内容,可以获得更好的体验,DDE 目前正在准备支持 HDR 内容的输出,这会让 DDE 拥有更好的显示效果。

    2.成体系的窗口动画

    在 X11 下,由于窗口管理和画面合成管理是两个进程,并且在启动速度上存在差异,所以只能采用一些“巧妙”的设计来规避视觉错误。

    但是在 Wayland 下,窗口管理器和窗口合成器被合并成一个进程,那么启动后就可以立即使用动画效果,例如可以设计视觉效果更好的登录动画。

    目前 DDE 的窗口动画支持并不多,且大部分是单调的线性动画,有些情况还需要客户端自己实现虚假动画,例如任务栏发生位置变化时,桌面的图标会进行计算,并自行改变大小,这引入了非必要的依赖。如果使用窗口动画,桌面并不需要关心任何外部因素,只需要设置自己在可用工作区域最大化,当任务栏发生位置改变时,合成器会自动调整桌面的大小,并产生相应的窗口动画。

    未来 DDE 会使用更多窗口动画来减少组件之间的依赖,以及实现更多更好的视觉效果。

    最后总结

    阅读至此,是不是对 Wayland 的概念及工作原理更加清晰啦?如果您有什么疑问也欢迎与我们互动探讨 Wayland。

    坦白说,DDE 的 Wayland 支持还处于初步阶段(技术预览版,请谨慎使用),未来我们会使用更多合成器提供的功能,来为桌面环境降低开发难度,提升性能。提供更好的体验。