一、開篇
前不久,寫了篇《經(jīng)驗 | 如何破Qt窗體的“卡頓”》一文,那篇文章中描述的Qt啟動方式是基于linuxfb的,在構(gòu)建編譯Qt源碼的時候,會自動創(chuàng)建與linuxfb相關(guān)的插件。該插件是通過linux的fbdev子系統(tǒng)直接寫入framebuffer去實現(xiàn)圖形顯示的,它只支持軟件渲染的內(nèi)容。
在本文中描述另外一種顯示方案:Wayland,并簡單描述Wayland的典型合成器:Weston(下文會寫到)。
下圖為小生使用Wayland-Weston運行Qt程序的Demo效果:
【開五個進(jìn)程的效果,每個進(jìn)程為一個窗體】
【開六個窗體的效果】
二、Wayland簡介
Wayland是一個顯示服務(wù)協(xié)議,用于創(chuàng)建多進(jìn)程系統(tǒng)。使用該協(xié)議,多個客戶機應(yīng)用程序(下文簡稱:客戶端)可以將它們自己的圖形內(nèi)容呈現(xiàn)到屏幕外緩沖區(qū),然后,使用Wayland協(xié)議將這些緩沖區(qū)傳遞給顯示服務(wù)器(通常稱為合成器),最后,合成器將合成內(nèi)容并將其定位在物理顯示器上。
總而言之,可以理解成為多個應(yīng)用程序的運行提供了一種類似于桌面的環(huán)境。
三、單進(jìn)程系統(tǒng)和多進(jìn)程系統(tǒng)
在單進(jìn)程系統(tǒng)中,關(guān)于UI的所有東西運行在一個單一的進(jìn)程中。在多進(jìn)程系統(tǒng)中,所有客戶端則在它們自己的專用進(jìn)程中運行。
單進(jìn)程系統(tǒng)是這樣一種場景:在設(shè)備系統(tǒng)上電啟動后,直接進(jìn)入我們設(shè)計的應(yīng)用程序,而沒有其他的軟件窗體進(jìn)程運行,在整個設(shè)備系統(tǒng)的完整運行周期里,這種狀態(tài)將一直維持。如下圖所示:
多進(jìn)程系統(tǒng)是這樣一種場景:這個與桌面環(huán)境類似,支持多個進(jìn)程的窗體顯示,而且彼此之間不會受到任何影響。如下圖所示:
在嵌入式設(shè)備系統(tǒng)中,由于其特殊性,單進(jìn)程系統(tǒng)和多進(jìn)程系統(tǒng)都會涉及到。
四、使用多進(jìn)程系統(tǒng)的優(yōu)點
(4-1)穩(wěn)定性提高了
當(dāng)客戶端掛起或崩潰后更容易恢復(fù)。如果我們設(shè)計的軟件UI比較復(fù)雜,這時候可考慮選擇多進(jìn)程系統(tǒng),因為如果UI的一部分崩潰了,它不會影響整個系統(tǒng)
多進(jìn)程系統(tǒng)可以防止可能的內(nèi)存泄露。在多進(jìn)程系統(tǒng)中,如果一個客戶端發(fā)生了內(nèi)存泄漏并消耗了大量內(nèi)存,那么當(dāng)客戶端退出時,該內(nèi)存將被恢復(fù)。與單進(jìn)程相比,內(nèi)存泄漏將會一直持續(xù)到整個系統(tǒng)重新啟動。
(4-2)安全性提高了
在單進(jìn)程系統(tǒng)中,都可以訪問彼此的內(nèi)存。例如,對敏感數(shù)據(jù)傳輸是沒有隔離的。在多進(jìn)程系統(tǒng)中,會進(jìn)行內(nèi)存隔離,從而提高系統(tǒng)的安全性。
(4-3)性能提高了
如果我們硬件板卡上的CPU有多個核,那么多進(jìn)程系統(tǒng)可以幫我們將負(fù)載均勻地分布到不同的核上,從而更有效地利用CPU,從而提高性能。
(4-4)提高互操作性
我們可以在多進(jìn)程系統(tǒng)中與非Qt客戶端進(jìn)行交互,只要客戶端能解析Wayland或X11。例如,如果我們將gstreamer用于視頻,或者如果想使用另一個UI工具包構(gòu)建的應(yīng)用程序,那么在多進(jìn)程系統(tǒng)中,可以將這些客戶端與基于Qt的客戶端一起運行。
為什么使用wayland替代X11
X11是上世紀(jì)80年代的桌面協(xié)議,現(xiàn)在已經(jīng)不太適合如今的圖形硬件。且X11很大、很復(fù)雜,缺少可定制性。用X11在不撕裂圖形的情況下達(dá)到60幀/秒運行客戶端幾乎很難。相比之下,Wayland則更容易實現(xiàn),且具有更好的性能,并且可在現(xiàn)代圖形硬件上高效運行。對于linux上的嵌入式多進(jìn)程系統(tǒng),Wayland是一個標(biāo)準(zhǔn)可靠的選擇。
然而在下列三種情況中,不太適合選擇wayland:
(1)硬件或平臺太老了,只支持X11的情況。
(2)必須運行Wayland協(xié)議中不存在特性的應(yīng)用程序。
(3)應(yīng)用程序使用的UI工具包不能在Wayland上運行的情況。
在嵌入式系統(tǒng)中,由于硬件資源的限制和對Wayland的一些影響,在選擇wayland作為窗體系統(tǒng)還需要折衷考慮:
(1)會增加顯存消耗
在多進(jìn)程中,每個客戶端都需要有自己的圖形緩沖區(qū),并將其發(fā)送到合成器。因此,與單進(jìn)程系統(tǒng)相比,將使用更多的顯存:在單進(jìn)程情況下,所有內(nèi)容都是一次性繪制的,不需要將不同的部分存儲在中間緩沖區(qū)中。
(2)會增加主內(nèi)存消耗
除了操作系統(tǒng)級的一些額外開銷外,運行多個客戶端還可能使用更多主內(nèi)存,因為每個客戶端需要重復(fù)一些部件。例如:如果運行QML,每個客戶端都需要一個單獨的QML引擎。因此,如果我們運行一個使用Qt Quick Controls的客戶端,它只加載一次。如果將這個客戶端拆分為多個客戶端,那么將多次加載Qt Quick Controls,初始化客戶端的啟動成本將變得很高。
(3)會重復(fù)存儲圖形資源
在單進(jìn)程系統(tǒng)中,如果我們在多個地方使用相同的紋理、背景或圖標(biāo),這些圖像只會存儲一次。相反,如果在多進(jìn)程系統(tǒng)中使用這些資源,則必須將它們存儲多次。在這種情況下,一種解決方案是:在客戶端之間共享圖形資源(Qt已經(jīng)允許在不涉及Wayland的情況下跨進(jìn)程共享主存中的映像資源)。
五、Weston
Weston是一個Wayland 合成器的參考實現(xiàn)。它開箱即用,提供一個功能齊全的桌面環(huán)境。可用于非桌面使用的環(huán)境,例如:汽車、嵌入式、飛行、工業(yè)、機頂盒和電視。它還提供了一個庫允許其他項目在Weston的基礎(chǔ)上構(gòu)建自己的運行環(huán)境。
如果我們將Qt運行在嵌入式linux平臺上,且選擇Weston作為了桌面環(huán)境,我們也可以單進(jìn)程的方式運行Qt程序:將Weston桌面的狀態(tài)欄取消,且將背景設(shè)置為透明的,然后設(shè)置Qt應(yīng)用程序為開機自啟動。這也是一種比較好的方式解決《經(jīng)驗 | 如何破Qt窗體的“卡頓”》一文中出現(xiàn)的現(xiàn)象。
審核編輯:劉清
-
合成器
+關(guān)注
關(guān)注
0文章
273瀏覽量
25450 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210415 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9308瀏覽量
86072
原文標(biāo)題:Wayland多進(jìn)程顯示
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
如何運行基于eglfs_kms的QT應(yīng)用程序
weston啟動失敗是為什么?
QT運行程序時出現(xiàn)walyland2個錯誤要怎么解決呢
imx6移植wayland&weston的運行參數(shù)失敗請問如何解決這個問題
請問下RK3568J buildroot怎么從wayland切換到eglfs呢
qt.qpa.wayland:xkbcommon在此構(gòu)建中不可用,不執(zhí)行鍵映射如何解決?
為什么無法在imx8mm上啟動weston/wayland?
imx8mmini qt客戶端應(yīng)用程序在weston桌面上運行時,顯示weston桌面背景顏色并立即恢復(fù)如何解決?
在MPSoC上運行基于eglfs_kms的QT應(yīng)用程序
在MPSoC上運行QT應(yīng)用程序
【工程師分享】在MPSoC上運行基于eglfs_kms的QT應(yīng)用程序

Qt 6.5添加Wayland原生接口
國產(chǎn)自主操作系統(tǒng)內(nèi)核宣布支持weston

評論