Linux显示

Linux显示

Linux的显示系统采用了多种技术、协议、扩展、应用程序、服务器(守护进程)、驱动程序和概念实现窗口系统例如:
Xorg、Wayland、X11、OpenGL、RandR、XrandR、屏幕分辨率、DPI、显示服务器等。

当我们没有全面了解时,众多的信息可能会令人不知所措或令人困惑。 Linux 显示系统的每一方都有多个文档,但是在全球范围内它到底是如何运作的?

答案1

Linux显示

Linux 的显示系统,使用多种技术、协议、扩展、应用程序、服务器(守护进程)、驱动程序和概念来实现窗口系统,例如:Xorg、Wayland、X11、OpenGL、RandR、XrandR、屏幕分辨率、DPI、显示服务器等等。这可能很难完全理解,但它的每一面都是为了特定的目的,并且它们不会同时一起使用。

X协议

X 窗口系统,X11(X 版本 11)是用于位图显示的窗口系统,常见于类 Unix 操作系统上,X 提供了 GUI 环境的基本框架:在显示设备上绘制和移动窗口以及与鼠标和键盘交互。 X 不强制要求用户界面,这是由单独的程序处理的。因此,基于 X 的环境的视觉样式差异很大;不同的程序可能呈现完全不同的界面。 X 起源于 1984 年麻省理工学院 (MIT) 的 Athena 项目。自 1987 年 9 月以来,X 协议一直处于版本 11(因此称为“X11”)。X.Org 基金会领导 X 项目,当前的参考实现,X.Org Server,根据 MIT 许可证和类似的许可许可证作为免费开源软件提供。

X 实施

大多数 Linux 发行版使用X.Org服务器它是 X.Org 基金会管理的 X Window 系统 (X11) 显示服务器的免费开源实现。 Xorg/X 本身不支持多种提供的功能,例如缩放或渲染,因此奥格用途扩展例如X修正,兰德R(RandR 的管理人为xrandr例如,它可以设置平移、分辨率或缩放),GLX(OpenGL 扩展),使成为或者合成的这会导致窗口层次结构的整个子树被渲染到离屏缓冲区,然后应用程序可以获取该缓冲区的内容并执行他们喜欢的任何操作,离屏缓冲区可以自动合并到父窗口中或者由外部程序合并,称为合成经理像某些人一样自己进行合成窗口管理器做;例如 Compiz、Enlightenment、KWin、Marco、Metacity、Muffin、Mutter 和 Xfwm。对于他人 ”非合成" 窗口管理器,可以使用独立的复合管理器,例如:皮康,Xcompmgr或者鳗鱼Xorg 支持的扩展可以列出:xdpyinfo -display :0 -queryExtensions | awk '/^number of extensions:/,/^default screen number/'

另一方面韦兰旨在作为 Xorg/X11 的更简单替代品,更易于开发和维护,但截至 2020 年,除了 Gnome 之外,桌面对 Wayland 的支持尚未完全准备就绪(例如KDE Kwin 和 Wayland 支持);在发行版方面,Fedora 确实使用默认情况下韦兰。请注意 Wayland 和 Xorg可以同时工作,这可能取决于所使用的配置。X韦兰是 X.Org 服务器代码库上的一系列补丁,用于实现在 Wayland 协议上运行的 X 服务器。这些补丁由 Wayland 开发人员开发和维护,以便在向 Wayland 过渡期间与 X11 应用程序兼容,并于 2014 年在 X.Org Server 版本 1.16 中主流化。当用户从 Weston 内运行 X 应用程序时,它会调用XWayland 来服务该请求。

整个范围

           

A显示服务器或窗口服务器是一个程序(如 Xorg 或 Wayland),其主要任务是协调客户端与操作系统其余部分、硬件以及彼此之间的输入和输出。显示服务器通过显示服务器协议(一种通信协议)与其客户端进行通信,该协议可以是网络透明的或仅支持网络。例如,X11 和 Wayland 是显示服务器通信协议。

如图a所示窗口管理器是桌面环境的另一个重要元素,它是一种系统软件,用于控制图形用户界面中窗口系统中窗口的放置和外观。大多数窗口管理器旨在帮助提供桌面环境。它们与底层图形系统结合使用,为图形硬件、指点设备和键盘提供所需的功能支持,并且通常使用小部件工具包编写和创建。 KDE 使用凯温作为窗口管理器(截至 2020 年,它对 Wayland 的支持有限),类似地,Gnome 2 使用元城和 Gnome 3 使用穆特作为窗口管理器。

窗口管理器的另一个重要方面是合成器或者合成窗口管理器,它是一个窗口管理器,为应用程序的每个窗口提供一个离屏缓冲区。窗口管理器将窗口缓冲区合成为代表屏幕的图像,并将结果写入显示存储器。合成窗口管理器可以对缓冲窗口执行附加处理,应用 2D 和 3D 动画效果,例如混合、淡入淡出、缩放、旋转、复制、弯曲和扭曲、洗牌、模糊、重定向应用程序以及将窗口转换为多种显示之一和虚拟桌面。计算机图形技术允许实时渲染视觉效果,例如阴影、实时预览和复杂的动画。由于屏幕是双缓冲,更新时不会闪烁。最常用的合成窗口管理器包括:Linux、BSD、Hurd 和 OpenSolaris-Compiz、KWin、Xfwm、Enlightenment 和 Mutter。每个都有自己的实现,例如 KDE 的KWin 的合成器有许多功能/设置,如动画速度、撕裂预防(垂直同步)、窗口缩略图、缩放方法,并且可以使用OpenGLv2/OpenGLv3 或X渲染作为一个渲染后端与 Xorg 一起。 (X渲染/渲染不要混淆X兰德R/兰德R)。

OpenGL(开放图形库)是一个跨语言、跨平台的应用程序编程接口 (API),用于渲染 2D 和 3D 矢量图形。该 API 通常用于与图形处理单元 (GPU) 交互,以实现硬件加速渲染。 OpenGL 是一个渲染库,可以与 Xorg、Wayland 或任何实现它的应用程序一起使用。 OpenGL 安装可以通过检查glxinfo | grep OpenGL

显示器解决计算机显示器或显示设备的显示模式或显示模式是指可以显示的每个维度中不同像素的数量。通常用宽度×高度表示,单位为像素:例如1024×768表示宽度为1024像素,高度为768像素。xrandr可以用来添加或者渲染/模拟新的显示分辨率。

深度PI代表每英寸点数,是空间打印/显示的衡量标准,特别是 1 英寸(2.54 厘米)跨度内可以排成一行的单个点的数量。计算机的屏幕没有点,但有像素,与之密切相关的概念是每英寸像素数或PPI,因此DPI是通过PPI概念来实现的。默认96DPI 测量值是垂直和水平 96x96。此外X DPI(每英寸点数)设置仅用于文本缩放吗?质量检查的信息非常丰富。

笔记

一些 KDE 的 GUI 工具: systemsettings5> 显示,kcmshell5 xserver以及kinfocenter

参考

链接和来源: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1112

答案2

这个问题相当广泛,关于这个主题可以写的东西比这个答案涵盖的更多。我试图提供有关 Linux 图形演变的历史视角。自 20 世纪 90 年代初 X Window 系统 (X11) 移植到 Linux 以来,Linux 上的图形、窗口系统和图形用户界面 (GUI) 经历了很多变化。

X 窗口系统

X Window 系统是 20 世纪 80 年代在 MIT 开发的。 X11 这个名称指的是 X 协议的协议版本 11,但 X10 在 1987 年被版本 11 取代之前也曾在 MIT 之外使用。

X Window 系统设计用于 20 世纪 80 年代最先进的图形系统。典型的工作站有一个连接到简单 CRT 控制器的单个帧缓冲区,该控制器在显示监视器上显示帧缓冲区的内容。 PC 和工作站时代之前的计算是通过连接到位于计算机机房的中央计算机的串行线(“哑”)终端来完成的。这一历史背景影响了 X11 的设计:图形应用程序可以在远程计算机上运行,​​用户使用具有图形功能的终端与程序进行交互。 “终端”可以是工作站或专用 X 终端。

X11 被设计为服务器-客户端系统。 X 服务器是唯一直接与图形硬件通信的部分。 X 客户端是使用 X 协议(使用本地 Unix 域套接字或 TCP/IP 连接)与服务器通信的应用程序。客户端使用 X 协议向服务器发送请求并从服务器接收事件消息。

请求包括以下消息:

  • 窗口创建
  • 映射/取消映射窗口:使窗口可见/不可见
  • 在窗口上绘图:绘制像素、线条、弧线、椭圆、像素图等。
  • 使用指定的字体、大小和样式显示文本
  • 移动窗口和调整窗口大小、更改窗口的堆叠顺序等。

客户端接收消息(并非详尽列表):

  • 对请求的答复
  • 按键和鼠标单击事件
  • 公开事件(需要重绘窗口的区域)
  • 焦点获得/丢失事件

为了使用户能够处理屏幕上的窗口,例如移动、调整大小、关闭、升高和降低窗口,提供了称为窗口管理器的特定应用程序。窗口管理器还可以显示窗口装饰,例如边框、标题栏和全局菜单。

您可以说 X11 服务器相当“高级”,因为它处理(或至少传统上处理)各种资源:窗口、字体、像素图、颜色图、图形上下文(例如前景色/背景色、线宽等) )。除此之外,服务器还负责窗口父子关系和窗口的堆叠顺序等事务。

X 协议被设计为可扩展的。可以教导 X 服务器执行新的技巧,并将新的操作码添加到协议中以使服务器执行这些技巧。例如,XRender 扩展引入了一种处理透明度的方法(“alpha 混合”)。引入此扩展主要是为了支持抗锯齿字体,但也用于桌面效果,例如窗口上的阴影。 RandR(“调整大小和旋转”)扩展使调整大小、旋转根窗口并将其反映在屏幕上成为可能。这使您能够使用倒置的投影仪来投影屏幕,或使用倾斜的显示器。

GLX扩展(OpenGL Extension to the X Window System)使得在 X 服务器提供的窗口中使用 OpenGL 成为可能。对 OpenGL 的调用嵌入在 X 协议请求中。

在 X11 发展的某个时刻,字体处理被转移到由客户端处理。这一变化背后的原因在X Window 系统的新发展

直接渲染

2000 年代初期,显示硬件与 1980 年代 X 开发开始时存在的简单黑白位图显示器相比已经取得了长足的进步。即使使用本地套接字,进程间通信 (IPC) 模型的 X11 相对开销也变得太大。解决方案是放弃 X 服务器是唯一直接与硬件对话的部分的原则,让客户端直接与显卡对话。这直接渲染基础设施(DRI)诞生了。

DRI 允许 X 客户端应用程序绕过 X 服务器并直接在图形适配器上进行渲染。由于除了传统的 X 服务器之外,还可以同时激活多个直接渲染应用程序,因此引入了一个名为直接渲染管理器的内核组件来仲裁对硬件的访问。DRI 架构有三个版本:原始 DRI(已过时)、DRI2 和 DRI3。

合成窗口管理器

进入 Linux 图形场景的下一个创新是合成窗口管理器。传统上,每个 X 客户端应用程序负责根据需要重新绘制其窗口(部分或整个窗口)。当窗口被映射到屏幕上而需要重新绘制时,或者如果窗口不再被其他窗口遮挡时,X 服务器会向应用程序发送 Expose 事件。当重叠的窗口被移除时,其下方的窗口就会暴露出来。未能重新绘制该区域会导致旧内容仍然显示。https://en.wikipedia.org/wiki/Visual_artifact

A合成窗口管理器改变这一点。应用程序渲染到自己的离屏缓冲区,每个缓冲区都是一个单独的屏幕,拥有该缓冲区的应用程序可以独占访问。合成窗口管理器的任务是在真实屏幕上的窗口中显示这些缓冲区,剪切被其他窗口遮挡或部分脱离屏幕的任何窗口。窗口管理器显示窗口的“组合”。

合成管理器通常还可以显示动画效果,例如缩放、扭曲、淡入淡出、旋转、模糊窗口。例如,移动窗口可能会使其摇晃,或者虚拟桌面可以显示在旋转立方体的侧面。

内核模式设置

X 服务器传统上还负责设置图形适配器的模式,例如分辨率和刷新率。此后,模式设置已移至称为内核模式设置 (KMS) 的 Linux 内核组件。这解决了 Linux 之间切换的很多问题虚拟控制台

埃夫德夫

X 服务器还了解输入设备,例如,必须在 X 配置中指定鼠标的类型。随着 X 服务器的引入,这个任务已经被解除了。埃夫德夫Linux 内核的子系统,提供通用输入事件接口。

韦兰

随着所有这些发展,X 服务器执行的许多任务已移至 X 服务器之外。使用直接渲染,客户端不再使用 X 协议。感谢 KMS,X 服务器不需要处理图形适配器的低级编程。借助 evdev,X 服务器中的输入设备处理得到了简化。当使用合成窗口管理器重新排列和扭曲窗口时,X 服务器不再知道屏幕上发生了什么。 “窗口管理器是新的 X 服务器”。

Wayland 的出现是因为我们意识到 X 服务器进程几乎没有什么可做的,并且通过消除中间人(X 服务器),可以实现更简单的桌面图形系统。向后兼容性通过提供克斯韦兰,一个修改后的 Xorg 服务器,使用 Wayland 表面显示顶级 X 窗口。

严格来说,Wayland 只是一个定义客户端如何与显示服务器通信的协议。 Wayland 协议与 X 协议完全不同:Wayland 协议不定义用于绘制图形或文本的消息,也不处理字体。

在 Wayland 架构中,窗口管理器和显示服务器合并为一个软件组件,即合成窗口管理器。客户可以通过使用 Wayland 协议的软件库请求要绘制的表面。 A ”surface 是代表屏幕上矩形区域的对象,由位置、大小和像素内容定义”。

客户端渲染到离屏缓冲区中,然后将其附加到表面,在屏幕上生成输出。客户端可以使用各种AP​​I来进行渲染:OpenGL、OpenGL ES等(“绘图API是什么?无论你想要什么”)使用双缓冲:客户端使用第二个缓冲区更新其图像,当该缓冲区包含连贯图像时,它会切换到在下一个显示器垂直消隐间隔显示。Wayland 的座右铭是:“每一帧都是完美的“,即窗户不会撕裂、闪烁或闪光。

Wayland 中的输入处理通过合成器,即唯一知道鼠标光标位于哪个窗口的组件(请记住,合成器也可能使窗口变形)。合成器将屏幕坐标转换为适当窗口的窗口本地坐标,并将事件发送到客户端。

如果您对 Wayland 的创建故事感兴趣,我建议您观看 Daniel Stone 的搞笑演示Wayland 和 X 背后的真实故事

答案3

*nix 有帧缓冲区基元,即将渲染为光栅显示的内存位图。随着硬件的改进,一家制造商的 Khronos API 扩展 EGLOutput/EGLDevice 和其他制造商的 GEM 是妥协的结果,广泛地组合在一起作为与 X 一起工作的直接渲染基础设施,以伪装 DISPLAY 堆栈的版权依赖性的开源解决方案。

相关内容