Wayland和Qt
Wayland是在Linux上作为X11的替代品开发的。它的主要目的是管理应用程序内容如何在共享屏幕上一起显示,以及用户如何与共享相同输入设备的多個应用程序交互。
在操作系统中,这种角色通常被称为显示服务器。Wayland显示服务器有时也可称为合成器和窗口管理器,指的是它在其职责中执行的具体任务。
在以下内容中,我们将简要介绍Wayland及其在Qt中的角色。有关Wayland本身更详细的信息和背景,请参阅官方文档。
什么是显示服务器
显示服务器是操作系统中管理屏幕空间和其他共享资源的部分。在典型的桌面系统中,您可能有很多独立的应用程序同时运行,每个应用程序都期望能够将图形渲染到屏幕上并接收输入。
显示服务器是应用程序和共享资源(如屏幕和输入设备)之间的链接。桌面系统上的典型显示服务器会将应用程序内容放置在单独的长方形“窗口”中,用户可以移动和调整窗口的大小。显示服务器确保应用程序内容在屏幕上的正确位置显示,活动窗口接收来自键盘的输入,重叠的窗口按照正确的顺序绘制,等等。
在其他类型的系统中,显示服务器可能更为严格。例如,如果屏幕是汽车上的仪表盘或叉车的控制面板,那么移动和调整窗口可能不是希望的。相反,每个应用程序可能被锁定在屏幕的预定义区域,并从预分配的设备接收输入。
无论如何,只要有多個相互隔离的进程争夺相同资源,显示服务器都是有用的。
Wayland的作用
Wayland名称可能指几个相关项目
- 一组显示服务器与其客户端之间通信的协议。
- 一个用C语言编写的库,带有进程间通信的功能,它是实现上述协议的基础。
- 一种基于XML的语言,用于扩展协议,以及一种将从这些扩展生成C语言绑定代码的工具。
Qt为协议的客户端和服务器端都提供了实现。
普通的Qt应用程序可以通过选择“wayland”QPA插件(在某些系统上是默认设置)作为客户端在Wayland显示服务器上运行。此外,可以使用Qt Wayland Compositor模块来开发显示服务器本身。
Qt还提供了方便的功能,可以轻松扩展Wayland协议并添加新接口。
Wayland与其他技术
在Linux桌面环境中,Wayland是X11及其相关扩展的替代品。它是一个核心的合成显示服务器,术语"合成器"通常用来描述Wayland服务器。这意味着客户端将内容渲染到离屏缓冲区,这些内容稍后将与屏幕上的其他客户端“合成”,从而实现窗口效果,如阴影、透明度、背景模糊等。
原始X11协议的一个重要设计原则是显示服务器可以运行在只有屏幕和输入设备的瘦终端上。其客户端将运行在具有更多处理能力的远程系统上,通过网络连接与服务器进行通信。
相比之下,Wayland的设计基于现代设置观察到的现象,即客户端和显示服务器通常运行在同一硬件上。分布式计算、远程存储和远程桌面功能通常通过其他机制处理。将这设计到协议中允许在客户端和服务器之间共享图形内存:当合成器在屏幕上放置客户端内容时,它可以直接从图形内存的一个部分复制到另一个部分。
为了让其正常运行,图形驱动程序必须支持Wayland。这种支持通过EGL的扩展提供,称为EXT_platform_wayland。
注意:Qt Wayland也支持在不支持EXT_platform_wayland的系统上进行合成,无论是通过XComposite还是通过将应用程序内容复制到共享CPU内存。但对于最佳性能,我们建议使用具有驱动程序支持的系统。
X11已扩展以支持合成和直接渲染等特性,但Wayland从一开始就是为了此类用例而设计的。它还旨在保持小巧和可扩展性,与X11随着时间的推移而发展的复杂性形成对比。
可扩展性和嵌入式系统
由于Wayland具有最小的核心和易于扩展性,因此在构建嵌入式Linux平台时是一个理想的工具。
例如,桌面风格的窗口系统集成不在核心协议中。相反,Wayland有一个特殊的协议扩展类别,称为“壳”,它为客户端提供管理其表面的方法。桌面风格的特性通过名为XDG Shell的壳提供。对于其他类型的系统,可以使用更专业(也许更严格)的“壳”。例如,在制作车载信息娱乐系统时,IVI Shell可能更受欢迎。
当客户端连接时,Wayland服务器会广播其支持的协议(或“接口”)列表,客户端可以绑定到它想要使用的接口。这可以是任何标准接口,也可以添加新的扩展。Wayland定义了一种易于理解的XML格式来定义协议,可以使用waylandscanner
工具从这些生成C代码。(在Qt中,我们还有qtwaylandscanner
,它会生成额外的C++绑定代码。)
在客户端绑定到接口后,它可以向服务器发送“请求”,服务器可以向客户端发送“事件”。请求、事件以及它们的参数都在描述协议的XML文件中定义。
对于从头开始构建平台,当您控制服务器和客户端的代码时,添加扩展是添加操作系统功能的一种简单、可控的方法。
多进程或单进程
在构建一个简单的Qt嵌入式平台时,让UI的所有部分在一个进程中运行是一个完全可行的选项。然而,随着系统变得更加复杂,您可能想考虑使用多进程系统。这正是Wayland适用之处。在Qt中,您可以在开发过程的任何时刻选择在单进程和多进程之间进行切换。
多进程的优势
以下图表展示了多进程和单进程系统之间的差异。
多进程客户端架构
单进程客户端架构
Qt Wayland Compositor 模块非常适合在嵌入式 Linux 的多进程系统中创建显示服务器和合成器。使用多进程有以下优点:
稳定性 | |
---|---|
当客户端挂起或崩溃时更容易恢复 | 如果您有一个复杂的用户界面,则多进程非常有用,因为如果 UI 的某个部分崩溃,它不会影响整个系统。同样,即使一个客户端冻结,显示也不会冻结。 注意:如果法律要求您的客户端渲染安全性关键信息,请考虑使用Qt Safe Renderer 概述。 |
防止可能的内存泄漏 | 在多进程系统中,如果一个客户端有内存泄漏且消耗了大量的内存,那么当该客户端退出时,这些内存会得到回收。与单进程不同,内存泄漏会持续到整个系统重新启动。 |
安全性 |
---|
在单进程系统中,所有客户端都可以访问彼此的内存。例如,敏感数据传输没有隔离;每一行代码都必须同等可信。设计上的这种隔离在多进程系统中是存在的。 |
性能 |
---|
如果您有多个核心的 CPU,多进程系统可以帮助平衡在不同核心上的负载,更有效地利用您的 CPU。 |
互操作性 |
---|
您可以在多进程系统中与非 Qt 客户端交互,只要您的客户端理解 Wayland 或 X11。例如,如果您使用 gstreamer 进行视频,或者您想使用另一个 UI 工具包构建的导航应用程序,您可以将这些客户端与您的其他基于 Qt 的客户端一起运行。 |
多进程的权衡
从单进程过渡到多进程时, importante να είσαι συνειδητός των παρακάτω ανταγωνισμών
增加的视频内存消耗 |
---|
这可能对嵌入式设备构成限制。在多进程的情况下,每个客户端都需要有自己的图形缓冲区,并将其发送到合成器。因此,与单进程相比,您使用的视频内存更多:在单进程中所有内容都一次绘制,不需要在不同中间缓冲区中存储不同的部分。 |
增加的主内存消耗 |
---|
除了在操作系统级别的额外开销外,运行多个客户端也可能使用更多的主内存,因为某些部分需要每次为一个客户端复制一次。例如,如果您运行 QML,则每个客户端都需要一个单独的 QML 引擎。因此,如果您运行一个只使用 Qt Quick Controls 的单个客户端,它会加载一次。如果您将其拆分为多个客户端,则 Qt Quick Controls 将多次加载,从而导致启动成本更高,以初始化您的客户端。 |
重复存储图形资源 |
---|
在单进程系统中,如果您在许多地方使用相同的纹理、背景或图标,这些图像只会存储一次。相比之下,如果您在多进程系统中使用这些图像,则必须存储多次。在这种情况下,一种解决方案是在客户端之间共享图形资源。Qt 允许在进程之间共享主内存中的图像资源,而不涉及 Wayland。另一方面,跨进程共享 GPU 纹理需要更复杂的方法。使用 Qt,此类解决方案可以作为 Wayland 扩展协议和例如 QQuickImageProvider 构建。 |
输入到光子延迟 |
---|
在单进程系统中,应用程序直接访问主帧缓冲区。这意味着在这种配置中,输入事件与屏幕反射之间的延迟可以最小化。在多进程系统中,应用程序内容必须使用三缓冲来确保在服务器同时读取缓冲区时,客户端不会绘制缓冲区,因为这会导致撕裂。这意味着在多进程系统中存在隐式延迟。 |
为何使用Wayland而不是X11或自定义方案
如前所述,X11今天不再是典型系统配置的理想选择。它相当庞大且复杂,并且缺少可定制的功能。事实上,很难用X11流畅地运行客户端,并达到60帧率而不撕裂。相比之下,Wayland更容易实现,性能更好,并且包含了在现代图形硬件上高效运行所需的所有部件。对于嵌入式Linux的多进程系统,Wayland已成为标准。
然而,如果您正在使用旧硬件或遗留应用程序,那么Wayland可能不是最佳选择。Wayland协议的设计考虑了安全和隔离,并严格/保守地对待客户端可以访问的信息和功能。虽然这导致了一个更干净、更安全的接口,但遗留应用程序可能期望的一些功能在Wayland上可能不再可用。
尤其是,在以下三种常见用例中,Wayland可能不是最佳选择:
- 硬件或平台很旧,只支持X11;在这种情况下,您别无选择。
- 您必须支持依赖于Wayland协议中缺失的功能的遗留应用程序,以提高安全性和简化。
- 您必须支持使用完全不支持Wayland的UI工具包的遗留应用程序。在某些情况下,您可以通过在 XWayland 上运行这些应用程序来解决此问题。
当X11非常流行时,开发人员编写自定义解决方案来规避X11问题。较老的Qt版本有Qt窗口系统(QWS),现在已经停止开发。如今,大多数这些用例都由Wayland覆盖,并且自定义解决方案变得越来越不常见。
Qt Wayland能提供什么
对于客户端
Qt客户端可以在任何Wayland组合器上运行,包括Wayland项目的一部分开发的参考组合器Weston。
任何Qt程序都可以作为Wayland客户端(多进程系统的一部分)或独立客户端运行。这是在启动时决定的,在那里您可以选择不同的后端。在开发过程中,您首先可以在桌面上开发客户端,然后在实际硬件上进行测试。您不必始终在目标硬件上运行您的客户端。
单进程客户端开发
如果您在Linux机器上进行开发,您还可以在开发机器上的窗口中运行组合器。这可以让您在一个与目标设备密切相似的环境中运行客户端。无需重新构建客户端,您还可以使用 -platform wayland
运行它组合器内部。如果您使用 -platform xcb
(用于X11),您可以在桌面上运行客户端。换句话说,您可以在组合器准备好使用之前开始开发您的客户端。
对于服务器
服务器或组合器连接到显示器,并在屏幕上显示每个客户端的内容。组合器处理输入并向相应的客户端发送输入事件。相反,每个客户端连接到组合器并发送其窗口的内容。组合器负责决定
- 如何以及在哪里显示内容
- 显示哪些内容
- 如何处理不同客户端的图形缓冲区
这意味着,决定多进程系统的权力在于合成人。例如,客户端可以是3D场景的一部分,墙上有窗口,在VR系统中,映射到球体等。
Qt Wayland Compositor 是一个用于构建自己的合成的API。它为您提供了构建自定义合成器UI和管理工作窗口的完全自由。您可以结合Qt Quick和QML与Qt Wayland Compositor来创建令人印象深刻的UI。更多信息,请参阅 Qt Wayland Compositor。
Qt还提供了强大且用户友好的API,以实现Wayland扩展并在QML或C++中使用它们。
相关内容
© 2024 The Qt Company Ltd。此处包含的文档贡献者是各自所有权的版权所有者。提供的文档是在自由软件基金会发布的GNU自由文档许可证版本1.3的条款下许可的。Qt和相应的标志是The Qt Company Ltd在芬兰以及全球其他国家的商标。所有其他商标均为其各自所有者的财产。