Linux 圖形棧從入門到放棄 --- Linux 圖形相關概念簡介

2023-07-02 18:00:37

PS:要轉載請註明出處,本人版權所有。

PS: 這個只是基於《我自己》的理解,

如果和你的原則及想法相沖突,請諒解,勿噴。

環境說明

  無

前言


  在日常生活中,像我們常用的ubuntu(Linux),windows,android,mac等等系統,我們都能夠看到豐富的圖形介面。此外,如果大家瞭解過以前的嵌入式系統,很多的UI是自己寫程式來畫的。那麼大家是否思考過一個問題,這些介面的工作原理是什麼?介面是怎麼顯示出來的呢?

  此外,大家在平常的時候,如果要關注這方面內容的話,有一些詞是經常聽到的,例如:GPU, 渲染,OpenGL,OpenGL ES, EGL,OpenCL,DRM,DirectX,X11, Wayland等等。這裡的詞或多或少都和介面顯示有著一定的關係。

  在這個文章系列裡面(挖坑系列),我將會從顯示的理論概念上開始,逐步引入現在的主流的顯示方法。然後可能會挑選部分顯示過程中的內容,然後細講一點,畢竟這個內容太大了,我也僅僅是瞭解其中的一小部分。

  最終,本系列文章的目的還是幫助我自己或者大家能夠對現在的主流的系統的顯示理論框架及一些常見的功能和概念進行熟悉,以後若遇到關聯的內容或者問題,能夠大概「感知」到這個事情是屬於顯示的哪個部分。

  下面,讓我們先來看看,顯示框架的一些基本概念。





Windowing System (視窗系統)


  此部分根據以下參考連結整理:https://en.wikipedia.org/wiki/Windowing_system

  在計算機中,視窗系統(或視窗系統)是分別管理顯示屏不同部分的軟體。它是一種圖形化使用者介面(GUI),它為使用者介面實現了WIMP(視窗、圖示、選單、指標)範例。

  技術細節:任何視窗系統的主要元件通常稱為顯示伺服器,儘管視窗伺服器或合成器等替代名稱也在使用中。任何執行並在視窗中顯示其 GUI 的應用程式都是顯示伺服器的使用者端。顯示伺服器和它的使用者端通過通訊協定相互通訊,該協定通常被稱為顯示伺服器協定,顯示伺服器是使用者端和使用者之間的中介。

  這裡引入了顯示伺服器協定,我們常見的著名的顯示伺服器協定有:

  • X11 (類unix)
  • Wayland (類unix)
  • SurfaceFlinger (android)
  • Quartz Compositor (macos)
  • Desktop Window Manager (windows)

  在這裡,有幾個重要的概念需要記住:視窗系統,顯示伺服器(視窗伺服器或合成器),顯示伺服器協定,顯示伺服器協定對應的使用者端。你可以認為視窗系統就是這些概念形成的軟體集合。





Window manager (視窗管理器)

  此部分根據以下參考連結整理:https://en.wikipedia.org/wiki/Window_manager

  視窗管理器是一種系統軟體,用於控制圖形化使用者介面中視窗系統內視窗的放置和外觀。

  我們常見的應用廣泛的視窗管理器有:

  • gnome (類unix)
  • kde (類unix)
  • dwm (windows)

  對於視窗管理器來說,我們就把它當做管理各種介面的一個程式即可,注意這個概念,相對於視窗系統來說,我自己認為:可以放到顯示伺服器或者顯示伺服器協定對應的使用者端裡面。





視窗系統相關概念舉例(以Linux為例)


  在Linux中,其主流桌面有兩個常見的框架,一個是基於X11的顯示框架,一個是基於Wayland的顯示框架。



X.Org Foundation

  此部分根據以下參考連結整理:https://en.wikipedia.org/wiki/X.Org_Foundation

  X.Org 基金會是一家非營利性公司,其授權研究、開發、支援、組織、管理、標準化、推廣和捍衛一個免費和開放的加速圖形堆疊。這包括但不限於以下專案:DRM、Mesa 3D、Wayland和X Window System(在X.Org Server的實現中)。

  這個是實現X11相關的一個開源組織。



X Window System(X/X11)

  此部分根據以下參考連結整理:https://en.wikipedia.org/wiki/X_Window_System

  X視窗系統(X Window System,也常稱為X11或X,天視窗系統)是一種以點陣圖方式顯示的軟體視窗系統。最初是1984年麻省理工學院的研究,之後變成UNIX、類UNIX、以及OpenVMS等作業系統所一致適用的標準化軟體工具包及顯示架構的運作協定。X視窗系統通過軟體工具及架構協定來建立作業系統所用的圖形化使用者介面,此後則逐漸擴充套件適用到各形各色的其他作業系統上。現在幾乎所有的作業系統都能支援與使用X。更重要的是,今日知名的桌面環境——GNOME和KDE也都是以X視窗系統為基礎建構成的。

  由於X只是工具包及架構規範,本身並無實際參與運作的實體,所以必須有人依據此標準進行開發撰寫。如此才有真正可用、可執行的實體,始可稱為實現體。目前依據X的規範架構所開發撰寫成的實現體中,以X.Org最為普遍且最受歡迎。X.Org所用的協定版本,X11,是在1987年9月所釋出。而今最新的參考實現(參考性、示範性的實現體)版本則是X11 Release 7.7(簡稱:X11R7.7),而此專案由X.Org基金會所領導,且是以MIT授權和相似的授權許可的自由軟體。

  這個你可以理解為顯示伺服器協定。

X.Org / X.Org Server

  此部分根據以下參考連結整理:

  X.Org 專案提供了 X 視窗系統的開源實現。開發工作是與freedesktop.org社群一起完成的。X.Org 基金會是一家教育非營利性公司,其董事會為這項工作提供服務,其成員領導這項工作。

  注意:X.Org Server 是 X 視窗系統的X11顯示器服務協定的實現。

  這個你可以理解為顯示伺服器。



Wayland

  此部分根據以下參考連結整理:

  Wayland是一種顯示伺服器協定。它的目標是成為X Window System的繼任者。

  注意:Wayland的既是一種視窗系統,也是一種顯示伺服器協定。



Weston Compositor

  此部分根據以下參考連結整理:

  Wayland 專案的一部分也是 Wayland 合成器的 Weston 參考實現。Weston 可以作為 X 使用者端或在 Linux KMS 下執行,並附帶一些演示使用者端。Weston 合成器是一個最小且快速的合成器,適用於許多嵌入式和移動用例。

  注意:weston是wayland顯示器服務協定的開源參考實現。





Linux 顯示的主流顯示框架架構圖


  



X Architecture

  此部分根據以下參考連結整理:https://wayland.freedesktop.org/architecture.html

  X 起源於 1984 年麻省理工學院 (MIT)雅典娜計劃的一部分。 自 1987 年 9 月以來,X 協定一直處於版本 11(因此為「X11」)。X.Org 基金會領導 X 專案,與當前的參考實現X.Org Server在MIT 許可和類似的許可許可 下作為免費和開源軟體提供。

  其技術架構圖如下:

rep_img


Wayland Architecture

  此部分根據以下參考連結整理:https://wayland.freedesktop.org/architecture.html

  Wayland 是一個合成器與其客戶對話的協定,也是該協定的 C 庫實現。合成器可以是在 Linux 核心模式設定和 evdev 輸入裝置上執行的獨立顯示伺服器、X 應用程式或 Wayland 使用者端本身。

  其技術架構圖如下:
wayland_architecture.png

rep_img


XWayland

  此部分根據以下參考連結整理:

  Xwayland 是一個完整的 X11 伺服器,就像 Xorg 一樣,但它不是驅動顯示器和開啟輸入裝置,而是充當 Wayland 使用者端。

  其技術架構圖如下:

rep_img




OpenGL 和 Linux顯示的關係圖

  出處:

  其技術架構圖如下:

rep_img

  先明確3個概念:

  • OpenGL用來從簡單的圖形位元繪製複雜的三維景象。
  • Mesa也稱為Mesa3D和Mesa 3D 圖形庫,是OpenGL、Vulkan和其他圖形API規範的開源實現。我們的遊戲引擎等就是基於mesa3D或者直接基於SDL,GLFW等視窗庫來做相關的圖形化實現。mesa3D走DRM介面。
  • 直接渲染管理器( DRM ) 是Linux 核心的一個子系統,負責與現代視訊卡的GPU連線。其大概包含兩類行為Graphics Execution Manager (GEM)和Kernel Mode-Setting (KMS),KMS控制顯示控制器,直接處理和顯示器相關的東西。GEM主要是處理視訊記憶體管理、處理相關的內容。




以Wayland為例的Linux顯示框架

  出處:

  其技術架構圖如下:

rep_img

  這裡我們從3個維度進行分析:

  1. 3D遊戲引擎,直接基於相關的OpenGL介面進行開發,完成圖形影象相關的處理。事件處理其實還是基於libinput。
  2. 在X的架構模式下面,X.Org Server為顯示伺服器協定的實現,其視窗管理器為gnome和kde這樣的桌面管理軟體,其使用者端是libX或者libXCB。其直接基於opengl或者egl開發,注意圖形加速部分放在X顯示伺服器上的。
  3. 在Wayland的架構模式下面,其有wayland使用者端,有wayland合成器,有walyland視窗管理器。為了相容大量的x11程式,有X視窗管理器,對於XWalyland的一個使用者端。注意,對於真正的wayland來說,其圖形加速部分在wayland使用者端上,這樣少了很多互動通訊的內容,整體技術結構更加的明晰和高效。




關於Android的圖形堆疊(SurfaceFlinger和WindowManager)

  此部分根據以下參考連結整理:

  SurfaceFlinger 接受緩衝區,對它們進行合成,然後傳送到螢幕。WindowManager 為 SurfaceFlinger 提供緩衝區和視窗後設資料,而 SurfaceFlinger 可使用這些資訊將 Surface 合成到螢幕。

  其技術架構圖如下:

rep_img

  android的WindowManager管理和提供視窗meta資訊,SurfaceFlinger從buffer和WindowManager中取得影象和meta資訊,然後通過hal層,做影象硬體加速,如:vulkan或者egl等,然後送到顯示螢幕。我測試過,android走了vulkan和egl後,最終還是走drm介面,最終把圖送個螢幕。有興趣的童鞋可以使用drm測試程式來測試。

  其實我們看了android的顯示框架後,你會發現和傳統的Linux比較相像,同時,你可以更加深入的理解Android和Linux之間的一些聯絡。





後記


  上面的幾個概念是容易讓人疑惑的,首先有視窗系統這個概念,視窗系統的基本元件為顯示伺服器,在顯示器上顯示的使用者GUI程式叫做顯示伺服器的使用者端,伺服器端和使用者端之間的通訊協定叫做顯示伺服器協定。除了顯示伺服器,還有一個叫做視窗管理器的概念。

  對於Linux來說,其視窗伺服器有兩個應用比較廣泛,一個叫做X顯示伺服器,一個叫做Wayland顯示伺服器,它們對應的顯示伺服器協定分別是X11和Wayland協定,同理,與之協定對應的開源參考實現分別是X.Org Server 和 Weston Compositor。注意這裡的XWayland,其主要是為了相容大量老的基於X11的程式提出的一種替代方案,其本質上是作為Wayland顯示伺服器的一個使用者端,起到一個代理的作用。

  從"OpenGL 和 Linux顯示的關係圖" 以及 "以Wayland為例的Linux顯示框架"兩個小節的內容,我們可以大概提前的知道顯示是一個什麼東西。

  最後,我們最終要得到兩個詞:「渲染」,「顯示」。 我們提到的視窗系統裡面的概念,大部分內容就是對這兩個詞的應用。

參考文獻




打賞、訂閱、收藏、丟香蕉、硬幣,請關注公眾號(攻城獅的搬磚之路)
qrc_img

PS: 請尊重原創,不喜勿噴。

PS: 要轉載請註明出處,本人版權所有。

PS: 有問題請留言,看到後我會第一時間回覆。