首页 > 系统相关 >Linux 图形栈从入门到放弃 --- Linux 图形相关概念简介

Linux 图形栈从入门到放弃 --- Linux 图形相关概念简介

时间:2023-07-02 16:36:04浏览次数:39  
标签:显示 窗口 org --- https 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

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

  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: 有问题请留言,看到后我会第一时间回复。

标签:显示,窗口,org,---,https,Linux,服务器,图形
From: https://www.cnblogs.com/Iflyinsky/p/17520927.html

相关文章

  • IOS开发-UIImageView基本用法
    UIImageView是iOS中用于显示图像(图片、gif、svg等)的视图。它的主要功能有:1.显示图片UIImageView可以通过image属性显示一张UIImage类型的图片。可以是本地图片、从网络下载的图片等。2.设置填充模式可以通过contentMode属性设置图片在UIImageView内的显示和填充模式。内容......
  • Linux Subreaper 机制及内核态逃离方法(PR_SET_CHILD_SUBREAPER, prctl, systemed)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  无前言  由于某些其他的原因,我们在测试另外一个问题的时候发现了一个奇怪的现象:在我们一直朴素的认知下,如果一个程序创建了parent-process和child-......
  • 【numpy基础】--数组索引
    数组索引是指在numpy数组中引用特定元素的方法。numpy的数组索引又称为fancyindexing,比其他编程语言的索引强大很多。1.选取数据numpy的索引除了像其他语言一样选择一个元素,还可以间隔着选取多个元素,也可以用任意的顺序选取元素。比如一维数组:arr=np.random.randint(0,10......
  • LinuxDNS分析从入门到放弃(记一次有趣的dns问题排查记录,ping 源码分析,getaddrinfo源码
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  ubuntu18.04前言  我们这里有一块嵌入式板卡,当我们通过PING测试内网IP时,发现外网IP访问正常,但是测试域名访问一直报unknownhost。一般来说,在ubun......
  • 八期day05-java基础
    1Java环境搭建#合伙人---》下次讲#java:做反编译,发现好多java代码看不太懂,有些加密算法,也不太好破---》接下来的时候,要学习java开发 -找到加密算法---》chatgpt,让它给你写---》转成python---》自己手动调#java编译型语言 -javase:java基础---》python中变量定义,函数,......
  • 八期day06-java基础2
    零python和java字节字符串比较0.1java字节数组和字符串相互转换//1字符串转字节数组v4="彭于晏"byte[]b=v4.getBytes();//默认utf8形式System.out.println(b);//输出对象形式,看不到字节数组System.out.println(Arrays.toString(b));//try{//......
  • SimpleDateFormat的setLenient(true或false)-----自动计算日期
    有时候我们需要判断用户的日期格式是否正确,虽然绝大多数会在前台处理,但是也有需要从文件流读入的情况,如果日期不合格就需要抛异常,这时候就需要禁止SimpleDateFormat的自动计算功能。此时就需要用到setLenient(),这个方法的含义是是否严格解析日期,具体用法如下。packagecom.test.......
  • 小智-c语言
    1.环境搭建2.char&short&int  3.if&switch两种状态if,多种状态switch开关灯if,网络状态switch4.for&whilefor比while代码更紧凑5.static关键字 初始化只在第一次做6.const关键词在C语言中,const是一个关键字,用于声明常量或指定变量为只读。它是C语言......
  • java -- 常见API` 1
        ......
  • Snap算法学习01-03Snap中的类及其定义
        //graph.h定义的基本类型无向图  ///Undirectedgraph.##TUNGraph::ClassclassTUNGraph 有向图///Directedgraph.##TNGraph::ClassclassTNGraph 二部图///Bipartitegraph.##Bipartite_graphclassTBPGraph 多重图///Directedmultigr......