Linux 图形栈从入门到放弃 --- Linux 图形相关概念简介
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 许可和类似的许可许可 下作为免费和开源软件提供。
其技术架构图如下:
Wayland Architecture
此部分根据以下参考链接整理:https://wayland.freedesktop.org/architecture.html
Wayland 是一个合成器与其客户对话的协议,也是该协议的 C 库实现。合成器可以是在 Linux 内核模式设置和 evdev 输入设备上运行的独立显示服务器、X 应用程序或 Wayland 客户端本身。
其技术架构图如下:
wayland_architecture.png
XWayland
此部分根据以下参考链接整理:
Xwayland 是一个完整的 X11 服务器,就像 Xorg 一样,但它不是驱动显示器和打开输入设备,而是充当 Wayland 客户端。
其技术架构图如下:
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
其技术架构图如下:
先明确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
其技术架构图如下:
这里我们从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 合成到屏幕。
其技术架构图如下:
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显示框架"两个小节的内容,我们可以大概提前的知道显示是一个什么东西。
最后,我们最终要得到两个词:“渲染”,“显示”。 我们提到的窗口系统里面的概念,大部分内容就是对这两个词的应用。
参考文献
- 无
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
Linux 图形栈从入门到放弃 --- Linux 图形相关概念简介的更多相关文章
- Linux下pwn从入门到放弃
Linux下pwn从入门到放弃 0x0 简介 pwn,在安全领域中指的是通过二进制/系统调用等方式获得目标主机的shell. 虽然web系统在互联网中占有比较大的分量,但是随着移动端,ioT的逐渐流行 ...
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结 图
http://www.cnblogs.com/sammyliu/p/5225623.html
- 程序员Linux教程初窥入门-刘志敏-专题视频课程
程序员Linux教程初窥入门-313人已学习 课程介绍 程序员Linux教程初窥入门主要针对初级入门程序员的课程,也是为后期学习其他课程的一个基础,Git.Maven.Jenkins.R ...
- 图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决
作者:huangran,图形图像技术专家 应用开发以后无法知道性能瓶颈的根因是什么?滑动卡顿.白块产生的原因是什么?代码写完之后,不知道如何优化让它表现地更好-- 我们发现,如今测试人员的需求已经不只 ...
- Linux从入门到放弃、零基础入门Linux(第三篇):在虚拟机vmware中安装linux(二)超详细手把手教你安装centos6分步图解
一.继续在vmware中安装centos6.9 本次安装是进行最小化安装,即没有图形化界面的安装,如果是新手,建议安装带图形化界面的centos, 具体参考Linux从入门到放弃.零基础入门Linux ...
- Linux从入门到放弃、零基础入门Linux(第四篇):在虚拟机vmware中安装centos7.7
如果是新手,建议安装带图形化界面的centos,这里以安装centos7.7的64位为例 一.下载系统镜像 镜像文件下载链接https://wiki.centos.org/Download 阿里云官网 ...
- Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)
Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲键盘,手 ...
- Linux从入门到放弃
Ch.0 几点Linux常识 Linux严格区分大小写,不像windows中命令是不区分大小写的 Linux中所有内容以文件形式保存,包括硬件 Linux不靠扩展名区分文件类型,所有扩展名只是为了方便 ...
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...
随机推荐
- ChatGPT4实现前一天
目录 提出需求 代码实现 需求分析 单元测试 等价类划分 决策表 软件测试作业,用ChatGPT4来帮个小忙,小划水,勿喷勿喷,近期有相关作业的同学看到我的文章,建议修改一下,别撞车了,哈哈哈~ 提出 ...
- LeeCode 动态规划(一)
简述 如果某一问题存在很多重叠子问题,使用动态规划是非常有效的. 动态规划与贪心 贪心:每次都选择局部最优解 动态规划:每个状态都是由前一个状态推导得到 动态规划解题步骤 确定 dp数组 及下标的含义 ...
- FormData收集表单信息&并且转化为Json格式进行提交验证
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- AI测试101:测试AI系统的实用技巧&ML和AI自动化工具
基于人工智能的系统,也称为神经网络(NN Neural Networks),和其他应用程序一样是 "系统",因此需要测试.本文将指导你测试AI和基于NN的系统,并理解相关概念. 测 ...
- Nginx常用配置及和基本功能讲解
作者:京东物流 殷世杰 Nginx已经广泛应用于J-one和Jdos的环境部署上,本文对Nginx的常用的配置和基本功能进行讲解,适合Nginx入门学习. 1 核心配置 找到Nginx安装目录下的co ...
- Kubernetes(K8S) kubesphere 介绍
使用 Kubeadm 部署 Kubernetes(K8S) 安装--附K8S架构图 官网地址:https://kubesphere.com.cn/ KubeSphere 是个全栈的Kubernetes ...
- Valgrind交叉编译
Valgrind交叉编译 编译环境:ubuntu16.04 x64 开发平台:hisi3535 arm板 1.下载Valgrind 我下载的版本为 valgrind-3.12.0.tar.bz2 所有 ...
- OceanBase的学习与使用
OceanBase的学习与使用 简介 1. OceanBase数据库 注意这一块下载的其实是rpm包. 一般是通过下面的OAT或者是OCP工具进行安装. 有x86还有ARM两种架构. 虽然是el7结尾 ...
- 联想win8改win7
知识点分析:目前联想出厂预装Windows 8的台式和一体机使用都是UEFI+GPT硬盘的组合,并且开启了安全启动,但是目前除Window 8以外的其他Windows系统均不支持这种模式,因此如果需要 ...
- 自制ASP.NET 本地授权文件
asp.net登录时验证本地ini文件是否正确,主要步骤. 1.导入myini.DLL文件. 下载地址:http://yunpan.cn/cKw9kHJUk9Ui8 提取码 6631 2.添加引用 ...