怎么选择EmbeddedLinux的图形框架

Linux阅码场 2025-05-25 20:14

本文来源:jacob-chen

http://blog.iotwrt.com/linux/2017/03/08/How-to-choose-display-backend/


对于Android开发者来说,基本不用关心图形方案这些细节,你只要调用java的class,最后的性能都是有原厂和谷歌验证过的。 但对Linux开发者来说,情况要复杂的多,没有一个完美方案。。
所以当你决定要在Linux要开发应用的时候,一定要明确你的需求,对比方案间的优劣。

小框图:

X11

X11的基础构架,建议先谷歌一下,太庞大,历史遗留比较多,到现在我也没弄清楚一些调用流程。
下面主要讲讲dri2。dri2是xserver用来连接gpu的结构,下面这个链接里蛮详细的, https://en.wikipedia.org/wiki/Direct_Rendering_Infrastructure。
大概理解,dri2自己管理一个window下面的buffers, xserver都不会过问,只有swap front buffer的时候,才会调一些函数来wait page flip来进行画面的同步。不过这个front buffer是false的,要注意,最后显示还要进行compoiste(以rk的xserver为例,这里会用到cpu blit, 而wayland和qt eglfs这步是gpu做的)。
dri2全屏和不全屏的性能差距会比较大,因为全屏的情况下,dri2出来的flase front buffer,也就是这个window的drawbuffer, 是直接被作为全局的font buffer,送到ddx显示的,省去了compoiste。
所以在x11下开发3d应用的时候,一定要全屏,保证没有多余的compoiste,比如qt的qmlwindow就是一个完整的gl窗口(注:debian上不是)。
另外一提,rk平台上的xserver,还支持了glamor,意味一些compoiste可以被gpu加速到,如果是做多窗口的应用或者desktop类型的产品,这个featrue还是非常有用的,能运行x11上的所有软件,又有gpu加速合成。

2017.3.10

做了些实验,x11下egl的lag,在拉高cpu频率之后,显著的缓解,所以应该就是cpu参与了合成步骤,导致效率变低。

2017.5.21

在debian看到一些比较慢的现象,要注意不是x11的问题,而是debian的程序编译选项一般没带上gles。

links

https://en.wikipedia.org/wiki/X.Org_Server
http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlxwindows.html
https://dri.freedesktop.org/wiki/DDX/
https://www.freedesktop.org/wiki/Software/Glamor/

QT EGLFS

QT EGLFS是qt自己实现的一个gui系统,不支持多窗口,但也因此少了window compoiste。 
QT EGLFS和dri2的方式也差不多,区别就在于,qt eglfs的font buffer在自己用gpu compoiste后,是直接送给drm去显示,而X里是送Window manager去做compoiste,所以EGLFS在效率上是有优势的。
另外除了QT,常用的UI库里,SDL也是支持这种DRM+GL的方式的。

2017.3.11

QT EGLFS的流程其实可以通过代码追踪一下。
根据代码,一个qmlvideo的显示过程会是这样的(非qml的话不一样,会优先用xvimagesink的subwindow),surface路径会是QDeclarativeVideoOutput->QDeclarativeVideoRendererBackend,显示一帧frame的话,会先调用到QDeclarativeVideoRendererBackend::updatePaintNode,然后就是返回一个NV12 to RGB的shader,走正常qtquick程序的显示显示 ,最后QOpenGLCompositor会合成所有的window。
Qt EGLFS的流程还是很清晰的,就是先window自己render(qquickwindow是用的GPU)一个buffer, 然后QOpenGLCompositor把所有的window再render到一个buffer上,然后这个buffer送drm显示(如果就是一个primary window,就直接送drm了)。

links

http://doc.qt.io/qt-5/embedded-linux.html

Wayland

wayland是Linux上下一代的display server,从结构上来讲,也最相近android上的HWC,全部的compoiste都是gpu来做的,不会有xserver那样cpu合成的场景。
wayland除了gpu合成以外,另一个优势,就是overlay接口的存在,能允许移动平台上的一些2d加速模块,display模块在这个接口上被调用(这些模块才是移动平台能跑大分辨率ui的关键)。
wayland主要的问题是兼容性,比如你用qtmultimedia的话,会发现video sink不能换,因为不兼容wayland的窗口api。

links

https://en.wikipedia.org/wiki/Wayland

应用场景

3d应用

3d应用的瓶颈最主要在计算单元上,拷贝,compoiste一类的开销,根据具体场景再考虑。
建议直接raw的drm api或者qt eglfs。

视频播放

对视频播放来说,拷贝,compoiste的开销是决定性的。
Spec上的视频播放极限,比如rk3399,rk3288播放4k,rk3036播放1080p,基本上是不可能在通用框架,也就是走gpu实现的。 因为达到了芯片bandwidth的上限场景,如果让gpu去拷贝和转格式的话速度会很慢,必须要display的部分自己去处理显示视频数据。
但想让display部分去处理的话,软件上必须有对应的支持——-然而desktop based的gui framework大多缺失了这样一个东西。
之前在rk的系统上,我base X11做了一个“gstreamer sink” (https://github.com/rockchip-linux/gstreamer-rockchip/tree/master/gst/rksink/rkximage)。通过x的api获取窗口的位置,然后直接drm的api,绕过X系统,overlay画在窗口的位置。这样做确实可以发挥视频播放的极限,主要的问题就是没办法和gui系统融合,没办法叠加控件,如果使用的场景都是fullscreen,可以试试这做。
上文提了下wayland框架支持overlay,所以最理想的,还是wayland通过overlay的机制直接call的display单元显示,像android那样。
总结一下,所以如果视频性能不是那么高,又需要复杂UI,建议用gpu的框架。 
qt eglfs,放视频,按rk3288的性能,可以达到1080p 60fps。
x11,gles在rk平台的软件上,测试下来,性能比较差;不过已经有rkximagesink的overlay显示方案。
wayland暂时没有研究,理论上原生支持overlay的wayland是最好的,但是我觉得应该也就类似rkximageisnk的那种效果,不能和正常的窗口兼容。

Tips

libmali

libmali是mali gpu的userspace library,我也看不到代码,完全是黑盒,只能说根据一些类似的代码和文档猜测他的实现方式。
libmali有很多编译选项,我猜的话,除了软件硬件版本,还有下面两种。
一个是fbdev和gbm,分别对应了fbdev和drm两种内核驱动的场景。fbdev对比gbm有几个差异。
1.vblank 
用fbdev去跑on-screen的glmark,分数一般是要比gbm的高,原因就是这套流程没有去等待vblank。gbm的实现都会在最后swap front buffer的时候等待vblank,所以on-screen只能跑几十fps,fbdev的不会去等,因此fbdev的libmali on-screen的fps和off-screen的差不多。
2.zero-copy
所谓zero-copy就是不拷贝texture。一段在内存里的texture,要让gpu去使用,必须先用cpu把数据从这段内存拷到gpu能用的buf(dma-buf)里。如果这个texture数据本来就在一个dma-buf里的话,可以通过特定的api直接让gpu load,从而避免拷贝。dma-buf在gbm上的实现,搜索EGL_LINUX_DMA_BUF_EXT就可以。在fbdev上的实现,比较麻烦,“fbdev zero-copy” (https://community.arm.com/graphics/b/blog/posts/improving-arm-mali-drivers-on-fbdev)。
还有就是display server的选项,比如xserver,比如wayland。 这个就是支持在display server下运行,没什么好说的。

libdrm

drm的api分legacy api和新一点的atomic api,如果你直接用drm api开发程序,一定要注意这两个api的区别。
legacy api:
drmModeSetCrtc, drmModeSetPlane, drmModePageFlip都是legacy的api,这些函数什么意思,怎么用,可以搜索下网络资料。 大致上,drmModeSetCrtc包括了drmModeSetPlane包括了drmModePageFlip。
在rk平台上,drmModeSetCrtc和drmModeSetPlane都是atomic的,意味着你调用这些api后会一直block到vblank,drmModePageFlip是noneblock的,你调用后就会返回。一般来说不在一个程序里顺序调用会block的api,性能不会有太大问题。
atomic api:
legacy的api都是atomic的,而且容易重复调用,这就导致有些场景会很没效率。
比如wayland drm的场景下,有3个plane,每个周期内要更新这几个plane,如果全用drmModeSetPlane的话,就意味着要等待3次vblank,那么一个60hz的屏幕,你的fps最高只会有20fps。
为了解决这种情况,我们就需要有一个api,能在一次调用里,解决掉所有的事情,比如更新所有的plane,然后只用等一次vblank。 
drmModeAtomicCommit,具体用法请谷歌。


扫描二维码关注"Linux阅码场"


Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 本文主要针对分立方案高速输出电路,由于MOS管、稳压管、PCB布局布线都存在一些寄生电容,这些寄生电容都会影响高速输出电路的占空比,所以本文对这些寄生电容的影响进行简单说明。测试工况:电压:24V,负载类型:阻性负载2K,输出频率:200Khz,要求占空比45%~55%;电路拓扑如下图所示:图1寄生电容分布情况:如下图所示,MOS管寄生电容为Cgd、Cgs、Cds,稳压管寄生电容为Cd;图2而MOS管手册常见的参数如下图所示为Ciss、Coss、Crss(为啥是这些参数,而不改成Cgs、Cgd、
    用户1751282873645 2025-07-08 23:58 142浏览
  • 在物联网无线通信领域,随着行业应用场景的不断拓宽,同一频段下的设备通信需求正呈指数级增长,然而这一增长趋势却与频谱资源的有限性形成了鲜明对立,信道拥挤、信号串扰与非线性失真等不良现象所造成的“通信压力”正在持续放大。从智能家居的设备互联到工业物联网的实时控制,从智慧楼宇的广域组网到智慧城市的海量数据传输,有限的频谱资源不仅需要满足不断增长的设备通信需求,还需要适配不同场景对速率、时延与可靠性等差异化要求。在此背景下,如何在有限的频谱资源中实现更为稳定的无线通信质量,已成为物联网行业发展路径中的核
    华普微HOPERF 2025-07-07 16:13 481浏览
  • 曾经靠“砍一刀”撕裂传统电商格局的拼多多,如今疲态尽显。数据显示,拼多多今年第一季度实现营收957亿元,同比增长10%,市场预估1016亿元,相比预期低了近60亿元;经营利润为161亿元,相比去年同期下降38%;归属于普通股股东的净利润为147亿元,同比下降47%。与此同时,拼多多市值也坐上了“过山车”。去年市值一度突破 2180 亿美元,力压国内电商巨头阿里,今年(7月1日收盘)市值仅余 1497.59 亿美元,已不足阿里(市值2718.63亿美元)一半
    用户1742991715177 2025-07-05 14:24 383浏览
  • 什么是LoRaWAN? LoRaWAN技术及应用LoRaWAN(Long Range Wide Area Network)是一种低功耗、长距离、广域网络通信协议,特别设计用于连接物联网(IoT)设备。LoRaWAN采用无线通信技术,能够覆盖数十公里的范围,提供长时间的电池寿命,适用于智能城市、农业、工业自动化、环境监测,与健康医疗等领域应用。来源: LoRa Alliance一探究竟:LoRaWAN物联网应用优势营运商采用 LoRaWAN 具有多方面的优势,除了长距离覆盖范围及低功耗的特点外,还
    百佳泰测试实验室 2025-07-10 14:51 186浏览
  •   去年底,整理旧物,扔的扔了,留的留了,这不,十四个几十年前留下来的工业级小型排风扇,下图左上角处,又拿出来,下决心把它们再利用发挥余热。  呵呵,这回不是拆而是装了。怎么装呢?组装、固定、机架、接线,简单,也不简单,原则是一切都用手头现有废旧材料,争取做到一个不买!DIY,废物利用,如今时髦的话,以旧换新!摆上台面,找来木条,策划怎么做?  比一比,看一看,觉得合适,按尺寸锯开木条。  咋走线?想到了,在有限空间内弯转,从一个螺丝孔穿出来,整体拼凑整齐。   咋固定风扇呢?找来木片条,锯断,
    自做自受 2025-07-06 21:37 470浏览
  • 据知名市场研究机构Counterpoint Research发布的数据概览,2025年第二季度,中国智能手机销量预计将迎来小幅回暖,增长率约为1%。在这场销量微增的背后,华为与苹果两大品牌成为了推动市场前行的核心力量。其中华为手机的表现最为亮眼,数据显示,华为在中国市场的智能手机销量份额实现了12%的同比增长,这一成绩不仅使其成为了当季增长最快的品牌,更助力华为重新夺回销量榜首的位置。相比之下,vivo的表现就有些尴尬了。虽然还是位列第二,但vivo在第二季度的智能手机销量份额同比下降了9%,下
    用户1742991715177 2025-07-09 08:19 131浏览
  • 在数字化、自动化高速发展的今天,光电耦合器正以一种低调却不可或缺的方式,悄然改变着我们的生活。它不仅是电子电路中的“安全卫士”,更是连接信号世界的“桥梁”,凭借出色的电气隔离能力,为各类设备提供稳定可靠的信号传输保障。电气隔离——让系统更安全在工业控制系统中,安全始终是重中之重。光电耦合器通过光信号进行电气隔离,能够有效防止高压电流侵入低压控制电路。例如,在智能电网系统中,它广泛应用于电表与通信模块之间,确保数据传输的安全性,防止电网高压对低压设备造成冲击。在电动汽车的电池管理系统(BMS)中,
    腾恩科技-彭工 2025-07-05 13:56 420浏览
  •   几个月前,一个老旧的大风扇的散风圈(俺不知其专业名称)的开关按钮不起作用,就是锁不住了,散风圈也就不转了。今天,有空,就拿到工作台,开始拆解分析故障原因,能修好更好。  看看,用的时间够长了吧!皮肤都变颜色了。看标签,合格品2005年的。  底部四个螺丝固定,很容易拆开了。  看到掉下一个标签圆纸片,拿起来看看,是那个横向摇头的电机的。  找到那个按钮开关位置  应该是开关内部的有缺陷了。把它拆下来,一看就是正规合格品。  拿出我日积月累的分类藏宝盒,呵呵,找到一款螺丝孔位正好合适的。   
    自做自受 2025-07-10 11:16 222浏览
  • 在全球广泛倡导绿色低碳与可持续发展的时代浪潮中,新能源汽车作为实现节能减排的重要载体之一,正受到各国政府与企业的加速培育。在此背景下,为提升新能源汽车的市场渗透率,我国已率先进入充电基础设施建设的加速期,从私人专用充电桩到社区公用充电桩,从高速路网补能节点到城市公用充电桩,汽车补能网络正在急速膨胀中。图源:摄图网(已授权)据中国充电联盟(EVCIPA)最新统计数据显示,截止2025年5月份,我国充电基础设施累计数量为1440万台,同比上升45.1%。其中,在2025年1月~5月期间,我国充电基础
    华普微HOPERF 2025-07-09 16:13 183浏览
  • 提要:采用LOXIM的微孔雾化专用芯片LX8201,能突破压电陶瓷驱动电压超标(24伏)的技术难题,满足全球市场对喷雾玩具的电压安规认证要求。玩具行业尤其是喷雾玩具行业内人士都知道,喷雾玩具的压电陶瓷驱动电压超标(常需60-100V)与强制安规标准(中国,日本,欧美,都一样)对玩具电压的限制(≤24V)存在根本性冲突,如果采用“多层压电堆叠(MPA)技术“(比如日本TDK公司),成本将增加至现有微孔雾化片的10倍以上,这个矛盾一直没有得到好的解决。喷雾玩具在国内热销(淘宝/抖音),能卖的原因,无
    Loximonline 2025-07-08 10:55 221浏览
  • 工业物联网时代,作为一种普遍应用在汽车电子、工业控制与医疗器械等领域中的串行总线通信技术——CAN(Controller Area Network)总线基于消息广播模式,通过双绞线传输差分信号,是一种多主控(Multi-Master)的总线系统,具备极强的抗干扰能力、极低的传输延迟和高速数据传输性能。一种典型的CAN总线网络示意图在CAN总线通信过程中,CAN收发器作为物理层上的接口芯片,位于CAN控制器(MCU)和CAN总线之间,主要负责将来自CAN控制器(MCU)的数字信号与总线上的差分信号
    华普微HOPERF 2025-07-04 14:44 1951浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦