首页 > 其他分享 >Wayland入门

Wayland入门

时间:2024-01-24 14:46:59浏览次数:20  
标签:窗口 入门 Wayland 合成器 事件 服务器 客户端

概述

Wayland 是一个用于构建显示服务器和客户端应用程序的通信协议和库。它旨在取代 X Window System(X11)作为 Linux 和其他操作系统上的图形显示系统。

相对于 X11,Wayland 设计更为简单、现代化,并具有更好的性能和安全性。它采用了一种更直接的通信模型,通过消息传递机制进行客户端和服务器之间的通信,而不是像 X11 一样使用网络协议。

Wayland 的核心思想是将图形显示系统拆分为两个主要组件:

  1. Wayland 服务器(Compositor):负责显示的合成、窗口管理和输入事件的处理。它是 Wayland 协议的服务器端实现,并与底层图形驱动和硬件交互。
  2. Wayland 客户端:应用程序通过 Wayland 协议与服务器进行通信,发送绘图指令和接收输入事件。

Wayland 协议定义了服务器和客户端之间的通信规范,包括窗口管理、输入事件、缓冲区交换等。它使用对象和接口的概念来描述不同的功能,并通过消息传递进行交互。

Wayland 的优势包括:

  1. 更低的延迟:Wayland 的设计目标之一是减少显示系统的延迟,提供更流畅的用户体验。
  2. 更高的性能:由于 Wayland 的通信模型更简单直接,可以减少不必要的复制和转换操作,从而提高图形渲染性能。
  3. 更好的安全性:Wayland 采用了精细的权限控制和隔离机制,确保客户端应用程序无法访问其他应用程序的图形缓冲区数据。
  4. 易于开发和调试:Wayland 的设计简单清晰,易于理解和实现,使开发者能够更轻松地构建和调试图形应用程序。

X11架构

在讲Wayland架构前,我们先了解X11的架构

X11架构

  1. 内核从输入设备获取事件并通过 evdev 输入驱动程序将其发送到 Xorg。内核通过驱动设备并将不同的设备特定事件协议转换为 linux evdev 输入事件标准来完成所有的工作。
  2. Xorg 服务器确定事件影响哪个窗口,并将其发送到在该窗口上绑定的客户端。X 服务器实际上并不知道如何正确执行此操作,因为屏幕上的窗口位置由合成器控制,并且可能以 Xorg 服务器无法理解的多种窗口转换方式,如(缩小、旋转、摆动、 ETC)。
  3. 客户端查看事件并决定做什么。通常,UI 必须更改以响应事件 。 也许单击了复选框或指针进入了必须突出显示的按钮。因此,客户端将渲染请求发送回 Xorg 服务器。
  4. 当Xorg 服务器收到渲染请求时,它会将其发送给驱动程序,让其对硬件进行编程来进行渲染。Xorg 服务器还计算渲染的边界区域,并将其作为damage事件发送到合成器。
  5. damage 事件告诉合成器窗口中发生了某些变化,并且它必须重新合成屏幕上该窗口可见的部分。合成器负责根据场景图和 X 窗口的内容渲染整个屏幕内容。然而,它必须通过 X 服务器来呈现它。
  6. X 服务器接收来自合成器的渲染请求,并将合成器后缓冲区复制到前缓冲区或执行翻页。

Wayland架构

在 Wayland 中,合成器就是显示服务器。我们将 KMS 和 evdev 的控制权转移给合成器。Wayland 协议允许合成器将输入事件直接发送到客户端,并让客户端将损坏事件直接发送到合成器:

Wayland架构

  1. 内核获取一个事件并将其发送到合成器。这与 X11的情况类似,因为我们可以重用内核中的所有输入驱动程序。
  2. 合成器查看其场景图以确定哪个窗口应接收事件。场景图对应于屏幕上的内容,合成器了解它可能应用于场景图中元素的转换。因此,合成器可以选择正确的窗口并通过应用逆变换将屏幕坐标转换为窗口本地坐标。可以应用于窗口的变换类型仅限于合成器可以执行的操作,只要它可以计算输入事件的逆变换即可。
  3. 与 X 情况一样,当客户端收到事件时,它会更新 UI 作为响应。但在 Wayland 的情况下,渲染发生在客户端,客户端只需向合成器发送请求以指示已更新的区域。
  4. 合成器从其客户端收集损坏请求,然后重新合成屏幕。合成器可以直接发出 ioctl 来使用 KMS 安排页面翻转。

Wayland 的必要硬件支持

通常,硬件启用包括 modesetting/display、EGL/GLES2和 EGL/GLES2。最重要的是,Wayland 客户端和服务端都需要一种在进程之间有效共享缓冲区的方法。

标签:窗口,入门,Wayland,合成器,事件,服务器,客户端
From: https://www.cnblogs.com/hyyoxhk/p/17984539

相关文章

  • 用Java实现冒泡排序:实用教程带你入门
    在处理一些特定系统功能时,经常需要使用冒泡排序。例如,在一个电子商务网站中,需要对商品进行排序和过滤。这个时候可以使用冒泡排序对商品进行排序,以便用户能够按照价格、销量、评分等不同字段进行排序。通过使用冒泡排序,系统可以提供更加灵活和个性化的排序选项,以便用户能够更加方便......
  • Meson 入门指南之一
    相关站点Meson官网Meson官方文档MesonGitHub项目Meson介绍Meson的简介Meson(TheMesonBuildSystem)是个项目构建系统,类似的构建系统有Makefile、CMake、automake…。Meson是一个由Python实现的开源项目,其思想是,开发人员花费在构建调试上的每一秒都是浪费,同样......
  • # WinDbg学习一(入门)
    前言一直在零零散散的摸索WinDbg知识,但是总是不成体系,所以下定决心整理出来。简介WinDbg是一个调试器,可用于分析故障转储、调试实时用户模式和内核模式代码,以及检查CPU寄存器和内存。那么为什么不用VS呢,一个是VS安装在开发环境上,主要用于源码级调试,生产环境调试比较困难,另外......
  • php入门学习-4
      1、文件操作函数     (1)php访问文件或文件夹相关函数      filetype()//可以输出相关文件类型,如:dir/file/link        e.g.        echofiletype('C:\WINDOWS');//dir        echof......
  • OCaml入门-值与函数
    Ocaml使用;;来确认一个表达式的结束举例:#50*50;;-:int=2500OCaml告诉我们50*50的结果是int可以用x为常量50*50命名,注意这里x的值不可以被修改#letx=50*50;;-:valx:int=2500使用let...in...来定义局部变量,在下面这个例子中,y=5......
  • 基础入门
    命令行参数funcmain(){fmt.Println(strings.Join(os.Args[1:],""))}os.Args变量是一个字符串(string)的切片(slice),os.Args的第一个元素:os.Args[0],是命令本身的名字;其它的元素则是程序启动时传给它的参数。类型和数据结构Go语言主要有四种类型的声明语句:var、const、ty......
  • kettle从入门到精通 第三十三课 再谈 kettle 表输出 分区/分片
    1、之前第九章有讲过kettle表输出步骤,里面有简单的提到过表输出步骤里面的表分区设置,这里详细介绍下。 表分区数据:选择此选项可根据“分区”字段中指定的日期字段的值将数据拆分到多个表中。选择此选项后,数据将插入到表中,这些表的名称遵循<targettable>_<dateformat>模式,如t......
  • 软件自动化测试入门攻略
    软件测试自动化是什么?测试人员需要学习那些内容?学习后如何在项目中落地?零基础测试人员如何快速在企业落地自动化测试,为什么弯路这么多,究竟该如何破局?针对这些困扰许多测试工程师的问题,笔者基于对自动化测试的多年深耕、对软件测试自动化的丰富实战和持续研究,编著了软件自动化测试......
  • WhatsApp自动回复脚本:从入门到精通!
    在这个数字时代,社交媒体已经成为我们生活中不可或缺的一部分,特别是WhatsApp,这款全球流行的即时通讯工具,为我们提供了与亲朋好友、客户和业务伙伴之间即时交流的便利。但有时候,我们无法及时回复消息,或者想要实现某些自动化的操作,这时,WhatsApp自动回复脚本就显得尤为重要,那么,如何开发......
  • 【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函
    编辑一、前言二、拷贝构造函数⭕拷贝构造函数概念⭕拷贝构造函数的特点⭕拷贝构造函数的几种类型三、赋值运算符重载⭕运算符重载概念⭕赋值运算符重载⭕前置++和后置++重载四、const成员函数⭕const成员函数概念⭕常量成员函数需要满足的特点⭕常量成员函数有利条件⭕const常量的......