一、回顾

DDE 在 deepin 15 时期,使用 Mutter 作为带合成器的窗管,以及 Metacity 这种不带合成器的窗管,一个是在高性能设备上使用,一个是为低性能设备上使用。

在 deepin 20 时期,DDE 更换 KWin 当窗口管理器,由于 KWin 自带有关闭合成器的模式,所以 DDE 也放弃了 Metacity 作为备用窗管的选项。

 

二、痛点

从社区收集到的体验报告,绝大部分用户不满意在屏幕缩放上,一部分用户不满意在动画僵硬、死板、卡顿等用户体验上。

在以往版本的 DDE 中,受限于 X11 的架构,无法针对不同屏幕使用不同的缩放。很多用户可能是 1080p 的笔记本屏幕,外接一个 2K 或者 4K 的显示器,在 X11 下,用户只能照顾高分辨率的屏幕,牺牲低分辨率屏幕的使用,例如开启两倍屏幕缩放,在高分辨率下的屏幕显示刚刚好,但低分辨率屏幕已经无法查看任何一个正常的窗口了。

 

三、Treeland

Treeland 是 deepin 社区开发的一款基于 Wayland 协议的显示服务器,Treeland在底层使用 wlroots 作为 Wayland 的基础库,不修改 wlroots 的代码,也就意味着可以随时同步上游进度,获得新的功能与修复。上层使用 Qt,可以充分利用已有的大量 Qt 开发者,不再需要一直有专人负责特定项目,让 DDE 的技术栈更加统一。

 

四、优化

4.1 屏幕缩放

Treeland 直接管理屏幕,支持为不同屏幕设置独立的缩放比例,从而确保高分辨率和普通分辨率的屏幕可以完美共存。通过扩展协议,Treeland 还支持浮点数缩放比例(如 1.25 或 1.5),让各种分辨率下的显示效果都能得到良好支持。当窗口在不同屏幕间移动时,Treeland 会实时根据窗口所在位置调整其缩放比例。当窗口跨越两个屏幕时,系统会按照各自的缩放比例分别渲染窗口的不同部分,保证显示流畅且过渡自然。这种设计让用户在多屏工作时始终获得清晰、易用的界面体验。

 

4.2 复制模式

在 X11 下,复制模式是通过将两个屏幕设置为相同分辨率并重叠坐标来实现的。然而,这种方法存在以下显著劣势:

1、重复渲染

X11 需要为两个屏幕分别渲染相同的画面,这种资源利用方式非常低效。相比之下,Treeland 可以在 DRM 层面直接将同一份画面数据发送到多个屏幕,避免重复渲染,从而大幅降低 GPU 负载,提升性能。

2、画面压缩与变形

当两个屏幕分辨率差异较大时,X11 会强制调整分辨率以保持一致,导致画面压缩或变形。Treeland 则采用原始分辨率输出,通过在屏幕上下或左右留出空白区域(letterboxing/pillarboxing)的方式保持画面比例,有效避免画面失真,优化复制模式下的显示效果。

3、增强的视觉效果

Treeland 不仅保持画面比例,还能在空白区域(如上下或左右空隙)绘制额外内容,比如模糊处理后的桌面壁纸。这种设计既提升了美观性,又改善了用户体验,使复制模式更加精致自然。

总的来说,Treeland 的实现方案在性能、画面质量和用户体验等方面都显著优于传统的 X11 复制模式,为多屏应用场景带来了重要优化。

 

4.3 窗口效果

Treeland 使用 QtQuick 作为渲染层,然而 QtQuick 自带的部分组件性能并不太好,以下是其针对 QtQuick 自带组件性能问题的改进措施与实现细节。

1、圆角处理优化

QtQuick 的 Rectangle 组件支持圆角效果,但受限于只能同时对四个角进行操作,且性能存在一定瓶颈。Treeland 为了解决这一问题,实现了自定义的圆角裁剪控件:

  • 异形窗口支持:相比 QtQuick 原生 Rectangle 的四角统一裁剪,Treeland 的自定义控件支持不规则圆角设计(如 DTK 的异形窗口效果),大幅提升了界面灵活性。
  • 算法优化:
    • 新的圆角造型算法使得几何顶点数量减少 50%,降低了 GPU 的顶点处理负担;
    • 三角细分效率提高了 100%,进一步优化了 GPU 渲染性能。
  • 抗锯齿改进:引入自研抗锯齿算法,相比传统的 4xMSAA 算法,减少了 25% 的片元着色器计算量,同时保持视觉质量。
2、模糊效果重构

QtQuick 本身对模糊效果的支持较弱,性能表现难以满足复杂场景需求。Treeland 针对模糊效果进行了彻底重构:

  • 显存访问优化:通过直接从显存中读取组件下方的图像数据,避免了多余的 CPU-GPU 数据交换,提高了整体模糊处理效率。
  • 融合模糊算法:
    • 将多种模糊算法(如高斯模糊和双边模糊)进行融合,以实现更好的性能和视觉平衡;
    • 针对动态内容场景,采用增量模糊计算方式,进一步减少了帧间计算成本。

3、阴影效果优化

QtQuick 提供了 BorderImage 组件,能通过九宫格拉伸技术为组件增加装饰效果。但原生机制在大规模应用时性能不足。Treeland 的改进如下:

  • 材质复用:利用 ImageProvider 手动控制阴影贴图资源的创建和管理。在多个组件大小相同的情况下,共享同一份材质资源,避免重复加载,节省显存;
  • 实时更新:对于动态调整大小的窗口,Treeland 实现了实时更新的阴影裁剪算法,无需完全重新生成贴图,进一步优化了性能;
  • 视觉一致性:阴影的过渡效果与窗口动画联动,增强了整体界面的一致性和流畅性。

4、动画效果改进

Treeland 在动画实现上直接采用 QtQuick 的 State 和 Transition 机制,同时结合自定义优化,实现了流畅的界面动态效果:

  • 状态驱动:
    • 使用 State 定义组件的不同状态(如窗口最大化、最小化、还原等);
    • 通过 Transition 配置状态切换时的属性变化逻辑(如位置、大小、透明度等)。
  • 动画增强:
    • 借助 QtQuick 动画组件(如 NumberAnimation 和 PropertyAnimation),实现了高帧率的动画过渡;
    • 自适应动画曲线,根据窗口的大小和目标状态调整动画时长,提供更贴合用户直觉的交互体验。

通过以上优化,Treeland 不仅显著提升了组件的渲染效率,还在视觉效果和用户体验上实现了跨越式进步。具体表现为:

  • GPU 性能提升:相比 QtQuick 原生组件,Treeland 的渲染性能整体提高了;
  • 资源利用率优化:通过显存访问优化和材质复用技术,大幅降低了内存和显存占用,为低性能设备也带来了良好的兼容性。

 

4.4 截图录屏

Treeland 提供了高效的快速区域选择功能,支持吸附窗口以自动确定选区边界,使操作更加直观便捷。系统监视器可通过该接口快速获取特定窗口的相关信息,简化信息提取的流程。此外,Treeland 通过引入 DMA Buffer 技术,大幅提升了数据复制的效率,支持跨屏幕截图功能,无需客户端处理复杂的窗口逻辑。为保护用户隐私,Treeland 对截图和录屏返回的信息进行严格管控,自动抹除窗口的敏感信息,杜绝隐私泄露的风险。在录屏功能方面,Treeland对录屏会话进行了全面监控,实时提醒用户当前处于录屏状态,有效避免用户在不知情的情况下泄露隐私。这种设计还弥补了 X11 环境下程序可直接获取屏幕数据所导致的潜在隐患,显著增强了系统的隐私保护能力。

 

4.5 多用户

Treeland 的多用户优化是其核心设计目标之一。在传统的 LightDM 模式下,不同用户之间的切换依赖于 tty 层面前端程序的控制权转移,每个用户独占一个 tty 进行画面显示。然而,这种方式存在明显的问题:

1、切换延迟与闪烁

由于 tty 切换需要进行底层 DRM 和显卡驱动的操作,屏幕缓冲区会被不同程序覆盖,导致屏幕出现闪烁甚至短暂黑屏的现象。

2、资源消耗

每个用户运行独立的一套进程组,包括窗口管理器、任务栏、文件管理器等。这不仅占用大量内存,还要求每个用户运行独立的锁屏界面,额外增加了资源负担。

3、信息同步难题

为维持界面的一致性,用户切换时需要同步跨用户的状态,这带来了实现上的复杂性。

Treeland 在设计中引入了 DDM(Deepin Display Manager),通过重新定义工作流程,解决了上述问题:

1、集中式合成

Treeland 被独立抽离为一个统一的画面合成器,各用户的窗口画面都通过统一机制发送到 Treeland 进行最终的合成和显示。这种架构彻底消除了多 tty 切换的闪烁问题。

2、内存优化

不再需要为每个用户单独运行窗口管理器、锁屏界面等进程,大幅减少了内存开销。

3、状态统一
由于所有用户的界面由 Treeland 集中管理,切换用户时无需进行跨进程的状态同步,简化了实现。

即便在 LightDM 下,Treeland 仍然可以通过用户级别的 systemd 服务正常运行,作为一个独立的 Wayland 合成器使用。然而,在这种模式下,Treeland 无法实现 DDM 的多用户优化功能,仅具备单用户 Wayland 合成器的基础能力。Treeland 的多用户优化通过集中式合成与资源整合,显著改善了用户切换的体验,既提升了系统性能,又简化了实现逻辑。虽然在传统 LightDM 环境中无法完全发挥优势,但其灵活的架构设计确保了广泛的适用性和良好的兼容性。

 

 

4.6 手势

Treeland 在手势方面也有极大的进步,以下是 Treeland 和 X11 以及原生 Wayland 协议之间的对比:

1、X11 的手势事件处理
  • 手势事件由 libinput 生成,经由 XInput2 转发至 X Server。
  • X Server 解析事件后,依据焦点窗口的配置,将事件分发给客户端应用程序或窗口管理器(如 KWin)。
  •  KWin 通过 XInput2 接口处理全局手势,包括:
    • 注册输入管理器;
    • 识别全局手势;
    • 阻止手势事件冒泡。
  • 由于事件需在 libinput、X Server 和窗口管理器之间多次传递,造成较高延迟,导致手势动画不够流畅且跟手性差。
2、Wayland 的手势事件处理
  • 手势事件由 libinput 直接传递至 Wayland 合成器,无需经过中间转发(如 XInput2);
  • 合成器(如 Treeland)可直接处理手势事件,从而提升响应速度和复杂手势支持能力。
3、Treeland 的优化

  • 使用 Waylib 将 libinput 输入事件转换为 Qt 事件;
  • 利用 Qt 原生手势事件支持,将窗口或动画组件与手势处理器绑定,通过 QtQuick 实现流畅的跟手动画。

Wayland 采用直接事件处理机制,简化了手势事件的传递路径,大幅提升响应速度,有效降低延迟。相比之下,X11 的复杂交互流程使手势体验欠佳。Treeland 结合 Wayland 和 QtQuick 技术,实现了更出色的手势动画实时性和跟手性,带来现代化的用户体验。

 

五、总结

总的来说,Treeland 作为新一代的 Wayland 合成器,在多个方面都实现了重大突破:

  • 通过状态驱动和动画增强,显著提升了视觉效果和交互体验;
  • 引入 DMA Buffer 和隐私保护机制,让截图录屏功能更加安全高效;
  • 创新性地采用 DDM 和集中式合成,优化了多用户切换体验;
  • 基于 Wayland 和 QtQuick 技术,实现了更流畅的手势控制系统。

Treeland 的创新不仅显著提升了系统性能,为用户带来更现代化、更安全的使用体验,更充分展现了其在 Linux 桌面环境中巨大的发展潜力。

 

相关阅读:

(1)deepin 25 Pre 发行注记

(2)支持 deepin(深度)社区

 

内容来源:deepin(深度)社区

转载请注明出处

发表评论