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
此部分根据以下参考链接整理:
- https://x.org/wiki/
- https://wiki.archlinux.org/title/Xorg
- https://en.wikipedia.org/wiki/X.Org_Server
X.Org 项目提供了 X 窗口系统的开源实现。开发工作是与freedesktop.org社区一起完成的。X.Org 基金会是一家教育非营利性公司,其董事会为这项工作提供服务,其成员领导这项工作。
注意:X.Org Server 是 X 窗口系统的X11显示器服务协议的实现。
这个你可以理解为显示服务器。
Wayland
此部分根据以下参考链接整理:
- https://wiki.archlinux.org/title/wayland
- https://github.com/wayland-project/wayland
- https://wayland.freedesktop.org/building.html
Wayland是一种显示服务器协议。它的目标是成为X Window System的继任者。
注意:Wayland的既是一种窗口系统,也是一种显示服务器协议。
Weston Compositor
此部分根据以下参考链接整理:
- https://wayland.freedesktop.org/
- https://gitlab.freedesktop.org/wayland/weston/-/blob/master/README.md
- https://github.com/wayland-project/wayland
- https://wayland.freedesktop.org/building.html
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](https://flyinskyin2013.github.io/ImageBed0/blogs/blog_idx_121/x_architecture.png)
Wayland Architecture
此部分根据以下参考链接整理:https://wayland.freedesktop.org/architecture.html
Wayland 是一个合成器与其客户对话的协议,也是该协议的 C 库实现。合成器可以是在 Linux 内核模式设置和 evdev 输入设备上运行的独立显示服务器、X 应用程序或 Wayland 客户端本身。
其技术架构图如下:
wayland_architecture.png
![rep_img](https://flyinskyin2013.github.io/ImageBed0/blogs/blog_idx_121/wayland_architecture.png)
XWayland
此部分根据以下参考链接整理:
Xwayland 是一个完整的 X11 服务器,就像 Xorg 一样,但它不是驱动显示器和打开输入设备,而是充当 Wayland 客户端。
其技术架构图如下:
![rep_img](https://flyinskyin2013.github.io/ImageBed0/blogs/blog_idx_121/xwayland_architecture.png)
OpenGL 和 Linux显示的关系图
出处:
- https://zh.wikipedia.org/zh/File:Linux_kernel_and_OpenGL_video_games.svg
- https://www.kernel.org/doc/html/latest/gpu/index.html
其技术架构图如下:
![rep_img](https://flyinskyin2013.github.io/ImageBed0/blogs/blog_idx_121/opengl_and_linux.png)
先明确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显示框架
出处:
- https://zh.wikipedia.org/zh/File:Linux_kernel_and_OpenGL_video_games.svg
- https://www.kernel.org/doc/html/latest/gpu/index.html
其技术架构图如下:
![rep_img](https://flyinskyin2013.github.io/ImageBed0/blogs/blog_idx_121/LinuxGraphicStackAndGlamor.png)
这里我们从3个维度进行分析:
- 3D游戏引擎,直接基于相关的OpenGL接口进行开发,完成图形图像相关的处理。事件处理其实还是基于libinput。
- 在X的架构模式下面,X.Org Server为显示服务器协议的实现,其窗口管理器为gnome和kde这样的桌面管理软件,其客户端是libX或者libXCB。其直接基于opengl或者egl开发,注意图形加速部分放在X显示服务器上的。
- 在Wayland的架构模式下面,其有wayland客户端,有wayland合成器,有walyland窗口管理器。为了兼容大量的x11程序,有X窗口管理器,对于XWalyland的一个客户端。注意,对于真正的wayland来说,其图形加速部分在wayland客户端上,这样少了很多交互通信的内容,整体技术结构更加的明晰和高效。
关于Android的图形堆栈(SurfaceFlinger和WindowManager)
此部分根据以下参考链接整理:
- https://source.android.com/devices/graphics/surfaceflinger-windowmanager
- https://source.android.com/devices/graphics
SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕。
其技术架构图如下:
![rep_img](https://flyinskyin2013.github.io/ImageBed0/blogs/blog_idx_121/android_graphic.png)
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](https://flyinskyin2013.github.io/ImageBed0/blogs/qrcode_for_wx_official_account.jpg)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。