- 浏览: 24834 次
最新评论
揭开Wayland的面纱(一):X Window的前生今世
2010年11月17日
今天大家可能在“Wow! Ubuntu”或其他地方看到了这篇文章:Ubuntu 决定未来将启用 Wayland X-Server。Wayland是什么呢?它是X Window?还是要取代X Window?它的优势在哪里?Linux桌面/移动会因此有什么变化?在本篇中,我将回顾历史,展望未来,通过简易的文字,来先回顾一下X Window,从而继续解答Wayland。
注:在下对X Window的理解仅限于表面,文章中会有不少技术、历史方面的错误,若有大侠指出,不甚感激!
古老的X Window和现代的桌面技术
X Window在1984年由MIT研发,它的设计哲学之一是:提供机制,而非策略。举个最简单的例子吧:X Window提供了生成窗口(Window)的方法,但它没规定窗口要怎么呈现(map)或摆放(place),这个策略是由外部程序――窗口管理器 (Window Manager)所决定的。另外一个X Window的主要特点便是:Server/Client网络模型。不论是本地、远程的应用程序,都统一通过Server/Client模型来运作,比 如:让远程的应用程序跑在本地上。
X Window在推出之后快速演化,在1987年时候,其核心协议已经是第11版本了,简称:x11。这个版本已经将“提供机制,而非策略”这个哲学贯彻地 非常彻底,以致于核心协议基本稳定,不需要特别大的改动。于是乎,你看到了,现在是2010年,整整23年了,X Window依然是X11。
你可能会诧异,23年了,X Window的核心都没有特别大的变化,它能适应现代桌面的快速发展吗?这就要再次提到X Window的设计优势了,X Window在核心层之外提供一个扩展层,开发者可以开发相应扩展,来实现自己的扩展协议,比方说:
标准的Window都是矩形的,我如何用它来画一个圆形的窗口?X Window协议并未提供,但是通过“shape”这个扩展,X Window可以实现不规矩的窗
所以啊,这23年,X Window除了继续完善核心协议、驱动以外,很大程度上,都是扩展使它保持“与时俱进”,比如说:
要多头显示支持,这个是由“Xinerama”扩展实现的;要有多媒体视频回放的支持,这个是由“X Video”扩展实现的;OpenGL的3D支持,则是通过“GL”扩展来实现的;Compiz那样的合成桌面特效是怎么弄的?没错,还需要一个新的扩展,它便是:“Composite”;甚至Keyboard的支持,都是通过“X Keyboard Extension”(也就是“XKB”)的!X Window的核心,基本上就是在处理Server/Client、驱动之类的,而外部的那些支持,基本上全是通过“扩展”进行的。这没什么不好,X Window的结构设计精良,尽管是扩展,但它们没有任何效能上的问题。通过扩展方便地实现了一些对新技术、新事物的支持,而且方便维护,这再好不过了。
所以你看到了尽管23年过去了,基于X Window的GNOME、KDE,还能保持与同期Windows、Mac OS X竞争甚至某些方面更好,你就不得不佩服这些前辈在最初设计时定下的设计哲学是多少正确了。
虽然扩展的众多没有给X Window造成什么问题,也跟X Window的设计哲学相符,但是其Server/Client的网络构架,却一直倍受质疑,这便是:
X Window的效率问题
经常听到有人说,X Window的Server/Client结构严重影响效率,导致Linux桌面的效应速度一直不如Windows、Mac OS X。事实是不是这样呢?让我们还是透过原理来说话吧。
这张,便是当前X Window系统的架构图,稍微解释一下:
X Client:图形应用程序,如Firefox、Pidgin等;X Server:你看不见的控制中心;Compositor:合成桌面系统,如Compiz;Kernel/KMS/evdev:这便是Linux Kernel,后面会提到KMS技术了,其中还有一项evdev,是管理输入设备的。
通过这些箭头,你已经可以明白一些X Window的工作机制了,不过还从一个应用场景来解释一下,想像一下,当你点击了Firefox(X Client)的“刷新”按钮,将会发生以下事情:
你用鼠标点击了Firefox的“刷新”按钮,这时内核收到了鼠标发来的事件,并将其通过evdev输入驱动发送至了X Server。这时内核实际上做了很多事情,包括将不同品牌的鼠标发出的不同信号转换成了标准的“evdev”输入信息。这时X Server可以判断哪个Window该收到这个消息,并将某座标按下按钮的消息发往X Client――Firefox。但事实上X Server并不知道它得到的窗口信息是不是正确!为什么呢?因为当前的Linux桌面早已经不是10年前的那样了,现在是“Composite”即合成 桌面的时代,合成桌面的一个特点便是:Compositor(如Compiz)管理窗口的一切,X Server只能知道屏幕的某个点收到了鼠标消息,却不知道这个点下面到底有没有窗口――谁知道Compiz是不是正在搞一个漂亮的、缓慢的动画,把窗口 收缩起来了呢?假设应用场景没这么复杂,Firefox顺利地收到了消息,这时Firefox要决定该如何做:按钮要有按下的效果。于是Firefox再发送请求给X Server,说:“麻烦画一下按钮按下的效果。”当X Server收到消息后,它就准备开始做具体的绘图工作了:首先它告诉显卡驱动,要画怎么样一个效果,然后它也计算了被改变的那块区域,同时告诉Compiz那块区域需要重新合成一下。Compiz收到消息后,它将从缓冲里取得显卡渲染出的图形并重新合成至整个屏幕――当然,Compiz的“合成”动作,也属于“渲染(render)”,也是需要请求X Server,我要画这块,然后X Server回复:你可以画了。整个过程可能已经明了了,请求和渲染的动作,从X Client->X Server,再从X Server->Compositor,而且是双向的,确实是比较耗时的,但是,事实还不是如此。介于X Window已有的机制,尽管Compiz已经掌管了全部最终桌面呈现的效果,但X Server在收到Compiz的“渲染”请求时,还会做一些“本职工作”,如:窗口的重叠判断、被覆盖窗口的剪载计算等等(不然它怎么知道鼠标按下的坐 标下,是Firefox的窗口呢)――这些都是无意义的重复工作,而且Compiz不会理会这些,Compiz依然会在自己的全屏幕“画布”上,画着自己 的动画效果……从这个过程,基本可以得出结论:
X Client X Server Compositor,这三者请求渲染的过程,不是很高效;X Server,Compositor,这两者做了很多不必要的重复工作和正文切换。当然,这里我没有直接说明这种模式有没有给X Window造成效率问题,因为我们还少一个对照组。再看对照组之前,再来看看X Server的另一个趋势:
从“什么都做”到“做得越来越少”的X Window
X Window刚出现那会,主要提供一个在操作系统内核上的抽象层,来实现一个图形环境。所谓图形环境,最主要的便是:图形+文字。当时的X Window便提供“绘图”和“渲染文字”的机制。图形桌面上的图案和文字,都通过X Window合成并绘制出来。
一个典型的例子,如果你要用X来画点,就要在你的程序中通过“XDrawPoint”来进行,X Server收到消息后,便会画出相应的点。
现在,稍微接触过图形开发的人都知道了,在X Window下,一般都通过GTK+和Qt来进行了。更深一层的是,通过Cairo(Qt不是)来绘制图形。Cairo是什么?它是一个绘图+渲染引擎,著名的浏览器Firefox,便是使用Cairo来渲染网页和文字的。
Cairo是一个全能的、跨平台的矢量绘图库,它不是简单的包装一下各个平台的绘图库而已,尽管它最初是基于X Window开发出来的绘图库。现在Cairo支持各种不同的后端,来向其输出图形,比如X、Windows的GDI、Mac OS X的Quartz,还有各种文件格式:PNG、PDF,当然还有SVG。可以说,Cairo是一个很彻底的、全能的绘图库,现在无论绘制什么图形,都不会 考虑到用XLib了。
在Cairo之上,还有文字排版库:Pango,同样很明显的,处理文字排版,都不会用XFont之类的东西了,而是直接用Pango画。当然Pango也是跨平台的。
尽管在Linux平台下,Cairo、Pango的发挥依然是基于X Window的,但X Window充其量仅仅是一个“backend”而已,并不是少它不行。同理,跨平台的GTK+、Qt也只是视X为其中所支持的后端之一,假如哪天X真的 不在了,更换一个新后端,当前的GNOME、KDE也能完整的跑起来。
再提另外一个比较典型的关于“X曾经做的,但现已不做”的例子,便是“模式设置(mode-setting)”,说通俗点,就是“分辨率的设置”,但后面会说明不仅仅如此。
大家都知道,Linux只是一个内核,它只有控制台,通过Shell来进行交互,而控制台默认是80×24(单位:字符)的,要进入分辨率1024×768或更高的图形模式,就需要X进行一次“模式设置”,设置正确的分辨率等等。
尽管后来Linux也支持了各种用户层(user-space)的模式设置,让终端也支持标准的分辨率,但是X的模式设置与此是不相干的,所以一两 年前,在Linux的启动过程中,从终端进入图形界面时,屏幕会“闪”一下,这时便在进行“模式设置”――这里就一定要用“模式设置”这个术语了,因为即 使终端是1024的,进入X图形也是1024的,模式的变更还是要进行。
后来呢,嗯,2009年初期,KMS(内核模式设置)终于出现了!!!很少关心桌面图形的Linux内核,在当时引入了“内核级”的模式设置,也就 是说,在内核载入完毕、显示驱动初始化后很短的时间内,即设置好标准的分辨率和色深,通过在X层做相应的更改,从此X的初始化就可以省去“模式设置”这一 过程了!也就是从Fedora 10开始,Linux的启动非常平滑、漂亮,没有任何闪烁了。现在的Ubuntu 10.10也一样,KMS的应用已经相当成熟。
X从此又少了一样图形任务……“X泪奔~你们都不要我了。”
可以说,这20多年来,X从“什么都做”已经到了“做的越来越少”。绝大多数的开发者开发图形应用程序,已经可以完全无视X的存在了,X现在更像是一个中间人的角色。那么,X这个中间人会不会有一天,完全被其他事物所取代呢?
没错!它便是下篇要介绍的:Wayland!!!
ibentu.org供稿,LDCN(即LinuxDesktop.cn的缩写),中文名──“Linux桌面中文网”,是一个由在校大学生发起的,旨在让所有Linuxer一起参与、更新的Linux资讯、应用互动型社区站点.iBentu,LDCN的后继网站,正在不断建设中……
发表评论
-
字符串处理
2012-07-06 09:51 618第一节、字符串查找 1.1题目描述: 给定一个字符 ... -
笔记-正则表达式的2种引擎
2012-07-06 09:44 697正则表达式的引擎分为2种,一种是DFA引擎,一种是NFA引 ... -
常用正则表达式手册
2012-07-06 09:36 599匹配中文字符的正则表达式: [u4e00-u9fa5] ... -
网页换皮肤
2012-07-06 09:29 520... -
后台向前台js传递参数
2012-07-05 20:44 723aspx页面代码 //图片预览效果 function S ... -
基于组件中间件的前端架构
2012-07-03 13:42 738在现在的软件设计上,基本上采用的都是分布式系统,前端尤其突 ... -
基于组件中间件的前端架构
2012-07-03 12:15 596在现在的软件设计上,基本上采用的都是分布式系统,前端尤其突 ... -
Flex做的颜色器
2012-07-02 10:10 461此效果用对象的toString()方法来格式化输出字符串类 ... -
flex LineChart 的demo
2012-07-02 10:10 515... -
flex图片截取保存本地
2012-07-02 10:10 593Alert{font-size:12px;} ... -
Flex中,跨List实现SHIFT多选的例子
2012-07-02 10:10 640最近工作中遇到的问题,客户要求做这么个东西。还是稍微 ... -
FLEX 条形图(柱状图)设置刻度为百分比
2012-07-01 09:29 1070作者原创,如需转载请注明出处:www.krzone.org ... -
谈谈我对未来的想法吧
2012-07-01 09:28 760来总行珠海研发中 ... -
JavaFX Script With Eclipse 入门
2012-07-01 09:28 514最近Java社区最火的就是JavaFX Script的发布 ... -
Linux网络入侵检测软件
2012-07-01 09:28 690本软件是本人的毕业设计"作品"。当年是 ... -
Spring 3.0 整合 iBatis 3 Beta10 配置
2012-07-01 09:28 577弄了好长时间了,上网找各种资料,文档,最后发现Spring ... -
Flex Javascript交互实现代码
2012-06-30 11:13 541Flex Javascript交互实现代码 2010年09月 ... -
我参与的《云计算》项目前台Flex架构
2012-06-30 11:13 509我参与的《云计算》项 ... -
Flex 组成、变量、函数、命名空间
2012-06-30 11:13 577Flex 组成、变量、函数、命名空间 2011年04月13日 ... -
[引用]Ant 在Flex中的应用
2012-06-30 11:13 568[引用]Ant 在Flex中的应用 2011年08月13日 ...
相关推荐
本文详细介绍了linux XWindow视窗的历史及运行原理,随后又介绍了新一代Linux视窗技术WayLand的原理及发展状况
wayland-rs:Wayland协议(客户端和服务器)的Rust实现
Wayland归档的:Wayland客户端和服务器扩展,QtWayland和eglfs fork的补充
Wayland调试 调试Wayland协议消息的工具。 它直接与GDB集成,或者可以解析以WAYLAND_DEBUG=1运行的wayland应用程序/合成器的输出 例子 使用GDB(推荐) 这将使您的程序启动一个GDB实例 ./main.py -g program 在...
韦兰探险家轻松浏览和阅读Wayland协议文档。这个项目的动机Wayland协议以XML文件的形式发布。 虽然规范也可以HTML格式提供以阅读,但并非核心协议一部分的所有却并非如此。 该项目试图通过解析XML协议文件并将其转换...
与Wayland相关的ebuild的Gentoo叠加 激活覆盖(通过eselect存储库) $ eselect repository enable wayland-desktop $ emaint sync --repo wayland-desktop 使用叠加层中的软件包 AMD64 如果默认情况下在稳定的...
vim-wayland-剪贴板 使用+寄存器时,此插件允许Vim与Wayland剪贴板集成。 这意味着您可以将文本拉到+寄存器中并将其粘贴到其他Wayland程序中,或者将文本复制到其他Wayland程序中并从+寄存器粘贴到Vim中。 运算符和...
libinput是一个库,它为显示服务器和其他需要处理内核提供的输入设备的应用程序提供完整的输入堆栈。 libinput提供设备检测,事件处理和抽象,以最大程度地减少libinput用户提供用户期望的通用功能所需的定制输入...
mesa-27.0.1-glib-2.31-ubuntu20.04-linux-wayland-graphics vulkan.h,新一代重建,Wayland台面,台面256级灰度 链接所有python,mesa-27.0.1,ubuntu,20.04,ubuntu-21.04-hirsute support替换wayland到intel ...
威加 C++ 绑定 作者:里卡多·维埃拉 依赖关系 waf(构建) 路地 1.5.0 Python3 ...找到一种新的方法来处理监听器并用扫描仪发出它们 决定将 externs wl_*_interface 重写扫描仪以提高可读性 实施例外
nixpkgs-wayland (注:失败表示自动更新被卡住,需要干预。所有软件包都可在master尖端构建) 用于NixOS( nixos不稳定通道)的Wayland(sway / wlroots)工具的自动化,预先构建的软件包。 社区聊天在Matrix上: ...
韦兰 Golang Wayland 这包括两个呈现到共享内存中的示例应用程序。 在PC(x64)和树莓派(arm64)上...安装首先,您需要一个支持WaylandLinux,如果没有,请安装对测试有用的Wayland合成器weston: sudo apt-get ins
mesa-21.0.1_vulkan.h-ubuntu-21.04-hirsute-linux-wayland-graphics mesa,混频器,gamma-2.4,srgb,21.0.1至27.0.1,linux,彩色图形,grafics驱动程序,监控像素 ubuntu-21.04 修改视频驱动程序台面27.0.1 | ...
crouton-fedora-wayland:Fedora的Crouton版本 这是 Crouton 的修改版本,可将 Fedora 安装到您的 Chromebook 上。 这个版本并不像带有 Debian/Ubuntu 的 Crouton 的主要版本那么精致。 如果您不熟悉 Crouton 项目,...
Wayland是一种通信协议,旨在在单台计算机上的进程之间使用。 它主要由图形应用程序(客户端)用于与显示服务器进行通信,但是有关该协议的任何信息都不特定于图形,并且可以用于其他用途。 客户端通过Unix域套接字...
基于wayland的cairo,该代码是测试例子,会在界面显示一幅图,主要用于测试基于wayland的cairo使用方法。
KWin是一个易于使用但灵活的复合窗口管理器,用于Linux上的Xorg窗口系统(Wayland,X11)。 它的主要用法是与Desktop Shell(例如KDE Plasma Desktop)结合使用。 KWin旨在避免干扰。 用户根本不会注意到他们使用了...
Wayland在Go中的实现 该模块包含Wayland协议的纯Go实现。当前仅支持wayland-client功能。 使用从协议XML文件生成Go代码。 要加载游标,纯Go中的wayland-cursor和xcursor最小端口分别位于和 。 为了演示该模块的功能...
wayland 最新源码 1.12.0
很棒的Wayland 代码和资源的精选列表。 如果您想贡献,请阅读。 目录 屏幕截图 会话管理 状态栏 终端仿真器 工具 影片播放器 墙纸 执照 亮度控制 没有Wayland的特殊要求,因此您可以使用选择来控制屏幕亮度的xorg...