一、开篇
前不久,写了篇《经验 | 如何破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窗体的“卡顿”》一文中出现的现象。
HNLC-100A直流电阻快速测试仪(大电流)
微切片制作(四)
物联网发展迅猛 500亿助力智慧城市产业化
什么是励磁系统电压响应比?何谓高起始响应?
手机圈正在变成“屠宰场” 倒闭潮已蔓延
使用Wayland-Weston运行Qt程序
视觉传感器工作原理和特点
闻泰科技整个交易方案已尘埃落定 267.9亿元拿下优质资产
物联网是否能给防盗报警带来曙光
【新专利介绍】一种便携式电表
沁恒股份串口转USB键盘芯片:CH9328概述
半导体行业影响甚大的并购案例总结
GIC驱动设备信息添加
CAN总线一致性测试中的容错性测试介绍
新型基础设施网络安全高端论坛线上成功举办
鼎阳科技发布SPD4000X系列可编程线性直流电源
Qualcomm宣布推出5G网络基础设施系列芯片平台
小米X1什么时候上市?最新消息:小米新机X1配备骁龙660+全面屏,重回1999价位!
疫情后的智能家居行业 可能会迎来小规模的爆发
Bud Light推具有饮料外形的迷你游戏机