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 许可和类似的许可许可 下作为免费和开源软件提供。

  其技术架构图如下:

Wayland Architecture

  此部分根据以下参考链接整理:https://wayland.freedesktop.org/architecture.html

  Wayland 是一个合成器与其客户对话的协议,也是该协议的 C 库实现。合成器可以是在 Linux 内核模式设置和 evdev 输入设备上运行的独立显示服务器、X 应用程序或 Wayland 客户端本身。

  其技术架构图如下:

wayland_architecture.png

XWayland

  此部分根据以下参考链接整理:

  Xwayland 是一个完整的 X11 服务器,就像 Xorg 一样,但它不是驱动显示器和打开输入设备,而是充当 Wayland 客户端。

  其技术架构图如下:

OpenGL 和 Linux显示的关系图

  出处:

  其技术架构图如下:

  先明确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显示框架

  出处:

  其技术架构图如下:

  这里我们从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 合成到屏幕。

  其技术架构图如下:

  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 图形相关概念简介的更多相关文章

  1. Linux下pwn从入门到放弃

    Linux下pwn从入门到放弃 0x0 简介 pwn,在安全领域中指的是通过二进制/系统调用等方式获得目标主机的shell. 虽然web系统在互联网中占有比较大的分量,但是随着移动端,ioT的逐渐流行 ...

  2. 理解 Linux 网络栈(1):Linux 网络协议栈简单总结

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  3. 理解 Linux 网络栈(1):Linux 网络协议栈简单总结 图

    http://www.cnblogs.com/sammyliu/p/5225623.html

  4. 程序员Linux教程初窥入门-刘志敏-专题视频课程

    程序员Linux教程初窥入门-313人已学习 课程介绍        程序员Linux教程初窥入门主要针对初级入门程序员的课程,也是为后期学习其他课程的一个基础,Git.Maven.Jenkins.R ...

  5. 图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决

    作者:huangran,图形图像技术专家 应用开发以后无法知道性能瓶颈的根因是什么?滑动卡顿.白块产生的原因是什么?代码写完之后,不知道如何优化让它表现地更好-- 我们发现,如今测试人员的需求已经不只 ...

  6. Linux从入门到放弃、零基础入门Linux(第三篇):在虚拟机vmware中安装linux(二)超详细手把手教你安装centos6分步图解

    一.继续在vmware中安装centos6.9 本次安装是进行最小化安装,即没有图形化界面的安装,如果是新手,建议安装带图形化界面的centos, 具体参考Linux从入门到放弃.零基础入门Linux ...

  7. Linux从入门到放弃、零基础入门Linux(第四篇):在虚拟机vmware中安装centos7.7

    如果是新手,建议安装带图形化界面的centos,这里以安装centos7.7的64位为例 一.下载系统镜像 镜像文件下载链接https://wiki.centos.org/Download 阿里云官网 ...

  8. Linux从入门到放弃(为做一个开发+运维的全能性人才而奋斗)

    Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲键盘,手 ...

  9. Linux从入门到放弃

    Ch.0 几点Linux常识 Linux严格区分大小写,不像windows中命令是不区分大小写的 Linux中所有内容以文件形式保存,包括硬件 Linux不靠扩展名区分文件类型,所有扩展名只是为了方便 ...

  10. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

随机推荐

  1. day15:递归函数&递归练习题

    递归函数 递归函数的定义 : 自己调用自己的函数就是递归 递: 去    归: 回   一去一回就是递归 一个简单的递归例子 # 1.一个简单的递归例子 def digui(n): print(n,& ...

  2. Python程序笔记20230302

    Alice.Bob 和他们的朋友们 问题主体 密码学家 Rivest.Shamir.Adleman 于1977年4月撰写了一篇论文<数字签名与公钥密码学>(On Digital Signa ...

  3. MySQL(十)表空间结构:区、段与碎片区

    表空间结构:区.段与碎片区 为什么要有区? ​ B+树中的每一层的页都会形成一个双向链表,双向链表之间的物理位置可能会离得非常远,当遇到范围查询的适用场景的时候,就会定位到最左边和最右边的记录,然后沿 ...

  4. Redis(一)五种基本数据类型

    1 NoSQl数据库 1.1 技术的发展 技术的分类: ①解决功能性问题:javase ②解决扩展性问题:框架 ③解决性能问题:redis 1.2 NoSQL数据库概述 NoSQL(Not Only ...

  5. Rust中的derive属性详解

    1. Rust中的derive是什么? 在Rust语言中,derive是一个属性,它可以让编译器为一些特性提供基本的实现.这些特性仍然可以手动实现,以获得更复杂的行为. 2. derive的出现解决了 ...

  6. 连接MongoDB+Docker安装MongoDB

    一.连接MongoDB 工具:studio 3T 下载:https://studio3t.com/download-thank-you/?OS=win64 1.无设置密码 最终成功页面 2.设置了密码 ...

  7. SpringCloud导入spring boot项目当作子模块微服务IDEA不识别子module问题

    1.在父工程下面引入module. <modules> <module>study-design-mode</module> </modules> 2. ...

  8. Java的static修饰符

    静态域 如果将域定义为 static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如,假定需要给每一个雇员赋予唯一的标识码.这里给 Employee 类添加一个实例域 ...

  9. Hugging News #0428: HuggingChat 来啦

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  10. 【解决方法】windows连接域时报错:An Active Directory Domain Controller(AD DC) for the domain“chinaskills.com“....

    目录-快速跳转 问题描述 原因分析: 解决方案: 附言: 问题描述 操作环境与场景: 在 VM 内 windos 2019 在连接到域时,提示报错: An Active Directory Domai ...