电子说
一、开篇
前不久,写了篇《经验 | 如何破Qt窗体的“卡顿”》一文,那篇文章中描述的Qt启动方式是基于linuxfb的,在构建编译Qt源码的时候,会自动创建与linuxfb相关的插件。该插件是通过linux的fbdev子系统直接写入framebuffer去实现图形显示的,它只支持软件渲染的内容。
在本文中描述另外一种显示方案:Wayland,并简单描述Wayland的典型合成器:Weston(下文会写到)。
下图为小生使用Wayland-Weston运行Qt程序的Demo效果:
【开五个进程的效果,每个进程为一个窗体】
【开六个窗体的效果】
二、Wayland简介
Wayland是一个显示服务协议,用于创建多进程系统。使用该协议,多个客户机应用程序(下文简称:客户端)可以将它们自己的图形内容呈现到屏幕外缓冲区,然后,使用Wayland协议将这些缓冲区传递给显示服务器(通常称为合成器),最后,合成器将合成内容并将其定位在物理显示器上。
总而言之,可以理解成为多个应用程序的运行提供了一种类似于桌面的环境。
三、单进程系统和多进程系统
在单进程系统中,关于UI的所有东西运行在一个单一的进程中。在多进程系统中,所有客户端则在它们自己的专用进程中运行。
单进程系统是这样一种场景:在设备系统上电启动后,直接进入我们设计的应用程序,而没有其他的软件窗体进程运行,在整个设备系统的完整运行周期里,这种状态将一直维持。如下图所示:
多进程系统是这样一种场景:这个与桌面环境类似,支持多个进程的窗体显示,而且彼此之间不会受到任何影响。如下图所示:
在嵌入式设备系统中,由于其特殊性,单进程系统和多进程系统都会涉及到。
四、使用多进程系统的优点
(4-1)稳定性提高了
当客户端挂起或崩溃后更容易恢复。如果我们设计的软件UI比较复杂,这时候可考虑选择多进程系统,因为如果UI的一部分崩溃了,它不会影响整个系统
多进程系统可以防止可能的内存泄露。在多进程系统中,如果一个客户端发生了内存泄漏并消耗了大量内存,那么当客户端退出时,该内存将被恢复。与单进程相比,内存泄漏将会一直持续到整个系统重新启动。
(4-2)安全性提高了
在单进程系统中,都可以访问彼此的内存。例如,对敏感数据传输是没有隔离的。在多进程系统中,会进行内存隔离,从而提高系统的安全性。
(4-3)性能提高了
如果我们硬件板卡上的CPU有多个核,那么多进程系统可以帮我们将负载均匀地分布到不同的核上,从而更有效地利用CPU,从而提高性能。
(4-4)提高互操作性
我们可以在多进程系统中与非Qt客户端进行交互,只要客户端能解析Wayland或X11。例如,如果我们将gstreamer用于视频,或者如果想使用另一个UI工具包构建的应用程序,那么在多进程系统中,可以将这些客户端与基于Qt的客户端一起运行。
为什么使用wayland替代X11
X11是上世纪80年代的桌面协议,现在已经不太适合如今的图形硬件。且X11很大、很复杂,缺少可定制性。用X11在不撕裂图形的情况下达到60帧/秒运行客户端几乎很难。相比之下,Wayland则更容易实现,且具有更好的性能,并且可在现代图形硬件上高效运行。对于linux上的嵌入式多进程系统,Wayland是一个标准可靠的选择。
然而在下列三种情况中,不太适合选择wayland:
(1)硬件或平台太老了,只支持X11的情况。
(2)必须运行Wayland协议中不存在特性的应用程序。
(3)应用程序使用的UI工具包不能在Wayland上运行的情况。
在嵌入式系统中,由于硬件资源的限制和对Wayland的一些影响,在选择wayland作为窗体系统还需要折衷考虑:
(1)会增加显存消耗
在多进程中,每个客户端都需要有自己的图形缓冲区,并将其发送到合成器。因此,与单进程系统相比,将使用更多的显存:在单进程情况下,所有内容都是一次性绘制的,不需要将不同的部分存储在中间缓冲区中。
(2)会增加主内存消耗
除了操作系统级的一些额外开销外,运行多个客户端还可能使用更多主内存,因为每个客户端需要重复一些部件。例如:如果运行QML,每个客户端都需要一个单独的QML引擎。因此,如果我们运行一个使用Qt Quick Controls的客户端,它只加载一次。如果将这个客户端拆分为多个客户端,那么将多次加载Qt Quick Controls,初始化客户端的启动成本将变得很高。
(3)会重复存储图形资源
在单进程系统中,如果我们在多个地方使用相同的纹理、背景或图标,这些图像只会存储一次。相反,如果在多进程系统中使用这些资源,则必须将它们存储多次。在这种情况下,一种解决方案是:在客户端之间共享图形资源(Qt已经允许在不涉及Wayland的情况下跨进程共享主存中的映像资源)。
五、Weston
Weston是一个Wayland 合成器的参考实现。它开箱即用,提供一个功能齐全的桌面环境。可用于非桌面使用的环境,例如:汽车、嵌入式、飞行、工业、机顶盒和电视。它还提供了一个库允许其他项目在Weston的基础上构建自己的运行环境。
如果我们将Qt运行在嵌入式linux平台上,且选择Weston作为了桌面环境,我们也可以单进程的方式运行Qt程序:将Weston桌面的状态栏取消,且将背景设置为透明的,然后设置Qt应用程序为开机自启动。这也是一种比较好的方式解决《经验 | 如何破Qt窗体的“卡顿”》一文中出现的现象。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !