0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Wayland-Weston运行Qt程序

工程师邓生 来源:嵌入式小生 作者:iriczhao 2022-09-27 09:11 次阅读

一、开篇

前不久,写了篇《经验 | 如何破Qt窗体的“卡顿”》一文,那篇文章中描述的Qt启动方式是基于linuxfb的,在构建编译Qt源码的时候,会自动创建与linuxfb相关的插件。该插件是通过linux的fbdev子系统直接写入framebuffer去实现图形显示的,它只支持软件渲染的内容。

在本文中描述另外一种显示方案:Wayland,并简单描述Wayland的典型合成器:Weston(下文会写到)。

下图为小生使用Wayland-Weston运行Qt程序的Demo效果:

【开五个进程的效果,每个进程为一个窗体】

52c370fa-3dfc-11ed-9e49-dac502259ad0.jpg

【开六个窗体的效果】

52e3ca4e-3dfc-11ed-9e49-dac502259ad0.jpg

二、Wayland简介

Wayland是一个显示服务协议,用于创建多进程系统。使用该协议,多个客户机应用程序(下文简称:客户端)可以将它们自己的图形内容呈现到屏幕外缓冲区,然后,使用Wayland协议将这些缓冲区传递给显示服务器(通常称为合成器),最后,合成器将合成内容并将其定位在物理显示器上。

总而言之,可以理解成为多个应用程序的运行提供了一种类似于桌面的环境。

三、单进程系统和多进程系统

在单进程系统中,关于UI的所有东西运行在一个单一的进程中。在多进程系统中,所有客户端则在它们自己的专用进程中运行。

单进程系统是这样一种场景:在设备系统上电启动后,直接进入我们设计的应用程序,而没有其他的软件窗体进程运行,在整个设备系统的完整运行周期里,这种状态将一直维持。如下图所示:

532ab0a8-3dfc-11ed-9e49-dac502259ad0.png

多进程系统是这样一种场景:这个与桌面环境类似,支持多个进程的窗体显示,而且彼此之间不会受到任何影响。如下图所示:

534e70a6-3dfc-11ed-9e49-dac502259ad0.png

嵌入式设备系统中,由于其特殊性,单进程系统多进程系统都会涉及到。

四、使用多进程系统的优点

(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

    文章

    247

    浏览量

    25130
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • 服务器
    +关注

    关注

    12

    文章

    8111

    浏览量

    82496

原文标题:Wayland多进程显示

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式Linux-Qt环境搭建 Qt程序运行测试

    本编介绍如何在嵌入式Linux开发板上配置Qt运行环境,并进行Qt程序运行测试。
    的头像 发表于 06-01 09:07 6668次阅读
    嵌入式Linux-<b class='flag-5'>Qt</b>环境搭建 <b class='flag-5'>Qt</b><b class='flag-5'>程序</b><b class='flag-5'>运行</b>测试

    如何运行基于eglfs_kms的QT应用程序

    QT应用直接运行在EGL和OpenGL ES 2.0上。也就是,可以在没有窗口管理器(windowing system like X11 or Wayland)的情况下,运行
    发表于 01-07 17:13

    为什么使用4.14.98版本内核wayland却无法启动呢

    使用4.14.98版本内核,系统启动之后,wayland无法启动,查看日志如下:root@okmx8mm:~# cat /var/log/weston.log日期:2019-06-20 UTC[10
    发表于 12-30 06:42

    weston启动失败是为什么?

    Date: 2017-09-30 UTC[23:27:44.450] weston 1.11.0http://wayland.freedesktop.orgBug reports to: https
    发表于 01-06 06:52

    QT运行程序时出现walyland2个错误要怎么解决呢

    问题描述及复现步骤:QT运行程序,经常碰到下边这2个错误,不晓得要怎么规避或解决。很难重现,偶然性的。错误1:经常是鼠标滚轮造成如下这个错误:listener function for opcode
    发表于 11-10 17:28

    imx6移植wayland&weston运行参数失败请问如何解决这个问题

    :04.004] weston 5.0.90https://wayland.freedesktop.orgBug reports to: https://gitlab.freedesktop.org
    发表于 12-01 07:57

    请问下RK3568J buildroot怎么从wayland切换到eglfs呢

    你好,我这边不希望使用wayland桌面,只使用eglfs按说明关闭桌面系统/etc/init.d/S50launcher stop然后运行QT系统,/var/quicknanobrowser
    发表于 12-21 15:40

    qt.qpa.wayland:xkbcommon在此构建中不可用,不执行键映射如何解决?

    我使用 fsl-wayland 发行版为 IMX8M Quad 构建了 fsl-image-qt5-validation-imx。我在我的 imx8 中运行 QT 应用
    发表于 04-11 07:27

    为什么无法在imx8mm上启动weston/wayland

    :57:29 arx2 systemd[1]: Failed to start Weston, a Wayland compositor, as a system service. 尝试手动运行
    发表于 06-01 07:39

    imx8mmini qt客户端应用程序weston桌面上运行时,显示weston桌面背景颜色并立即恢复如何解决?

    中央处理器型号:MIMX8MM6CVTKZAA Linux内核:4.19.35 Qt版本:5.12.3 编译版本:aarch64-poky-linux-gcc 8.3.0 客户端应用程序weston桌面上
    发表于 06-05 08:07

    在MPSoC上运行基于eglfs_kms的QT应用程序

    EGLFS可以让QT应用直接运行在EGL和OpenGL ES 2.0上。也就是,可以在没有窗口管理器(windowing system like X11 or Wayland)的情况下,运行
    的头像 发表于 01-14 10:29 3855次阅读

    在MPSoC上运行QT应用程序

    Xilinx为MPSoC支持4种libMali的backend: X11, Wayland/GBM, Fbdev, Headless-EGL。QT支持4种plugin(插件)或者backend,FB,X11,Wayland,eg
    的头像 发表于 02-08 14:34 2449次阅读

    【工程师分享】在MPSoC上运行基于eglfs_kms的QT应用程序

    Xilinx为MPSoC支持4种libMali的backend: X11, Wayland/GBM, Fbdev, Headless-EGL。QT支持4种plugin(插件)或者backend,FB,X11,Wayland,eg
    发表于 03-08 06:18 1次下载
    【工程师分享】在MPSoC上<b class='flag-5'>运行</b>基于eglfs_kms的<b class='flag-5'>QT</b>应用<b class='flag-5'>程序</b>

    Qt 6.5添加Wayland原生接口

    因此,对于任何高级用例,Qt 6.5 都可以访问 Qt 6.5+ 在内部使用的 Wayland 对象。但对于 6.5 工具包版本,它目前是 QNativeInterface 私有命名空间的一部分,因为该接口在对于下一个
    的头像 发表于 12-14 10:49 672次阅读

    国产自主操作系统内核宣布支持weston

    weston是一套Wayland窗口显示协议的实现。而目前主流的Linux发行版桌面系统都在使用Wayland的方式做多窗口的显示合成,例如Ubuntu,Federa等。
    的头像 发表于 01-05 09:58 289次阅读
    国产自主操作系统内核宣布支持<b class='flag-5'>weston</b>