|--reference
https://www.cnblogs.com/newjiang/p/8414625.html
|--X Window System
1) X Window System简称X,或者X11,或者X-Windows。之所以称作X,
是因为在字母表中X位于W之后,而W是MIT在X之前所使用的GUI系统。
之所以称作X11,是因为在1987年的时候,X Window System已经进化到第11个版本,
后续所有的X,都是基于X11版本发展而来的(变动不是很大) 。
为了方便,后续我们都以X代指X Window System。
2) X最初是由X.org(XOrg Foundation) 维护,
后来基于X11R6发展出来了最初专门给Intel X86架构PC使用的X,
称作XFree86(提供X服务,它是自由的,它是基于Intel的PC平台) 。
而后XFree86发展成为几乎适用于所有类UNIX操作系统的X Window系统,
因此在相当长的一段时间里,XFree86也是X的代名词。
再后来,从2004年的时候,XFree86不再遵从GPL许可证发行,
导致许多发行套件不再使用XFree86,转而使用Xorg,
再加上Xorg在X维护工作上又趋于活跃,现在Xorg由成为X的代名词
(具体可参考“http://www.x.org/”) 。
3) X设计之初,制定了很多原则,其中一条
----"It is as important to decide what a system is not as to decide what it is”,
决定了X的“性格”,即:X只提供实现GUI环境的基本框架,
如定义protocol、在显示设备上绘制基本的图形单元(点、线、面等等) 、
和鼠标键盘等输入设备交互、等等。
它并没有实现UI设计所需的button、menu、window title-bar styles等元素,
而是由第三方的应用程序提供。
这就是Unix的哲学:只做我应该做、必须做的事情。
这就是这么多年来,X能保持稳定的原因。
也是Linux OS界面百花齐放(不统一) 的原因,各有利弊吧,后续文章会展开讨论。
4) X包括X server和X client,它们之间通过X protocol通信。
5) X server接收X clients的显示请求,并输出到显示设备上,
同时,会把输入设备的输入事件,转递给相应的X client。
X server一般以daemon进程的形式存在。
6) X protocol是网络透明(network-transparently) 的,也就是说,
server和client可以位于同一台机器上的同一个操作系统中,
也可以位于不同机器上的不同操作系统中(因此X是跨平台的) 。
这为远端GUI登录提供了便利,如上面图片所示的运行于remote computer 的terminal emulator,
但它却可以被user computer的鼠标键盘控制,以及可以输出到user computer的显示器上。
注4:这种情况下,user computer充当server的角色,remote computer是client,有点别扭,
需要仔细品味一下(管理输入设备和显示设备的是server) 。
7) X将protocol封装为命令原语(X command primitives) ,
以库的形式(xlib或者xcb) 向client提供接口。X client(即应用程序) 利用这些API,
可以向X server发起2D(或3D,通过GLX等扩展,后面会介绍) 的绘图请求。
|--3D渲染、硬件加速、OpenGL及其它
渲染(Render) 在电脑绘图中,是指:用软件从模型生成图像的过程。
模型是用严格定义的语言或者数据结构对于三维物体的描述,
它包括几何、视点、纹理以及照明信息。图像是数字图像或者位图图像。
其实我们在GUI编程中习以为常的点、线、矩形等等的绘制,
也是渲染的过程中,只不过是2D渲染。2D渲染面临的计算复杂度和性能问题没有3D厉害,
因此渲染一般都是指3D渲染。
在计算机中,2D渲染一般是由CPU完成(也可以由专门的硬件模块完成) 。
3D渲染也可以由CPU完成,但面临性能问题,因此大多数平台都会使用单独硬件模块
(GPU或者显卡) 负责3D渲染。这种通过特定功能的硬件模块,
来处理那些CPU不擅长的事务的方法,称作硬件加速(Hardware acceleration) ,
相应的硬件模块,就是硬件加速模块。
众所周知,硬件设备是多种多样的,为了方便应用程序的开发,
需要一个稳定的、最好是跨平台的API,定义渲染有关的行为和动作。
OpenGL(Open Graphics Library) 就是这类API的一种,也是最为广泛接纳的一种。
虽然OpenGL只是一个API,但由于3D绘图的复杂性,它也是相当的复杂的。
不过,归根结底,它的目的有两个:
1) 对上,屏蔽硬件细节,为应用程序提供相对稳定的、
平台无关的3D图像处理API(当然,也可以是2D) 。
2) 对下,指引硬件相关的驱动软件,实现3D图像处理相关的功能。
另外,openGL的一个重要特性,是独立于操作系统和窗口系统而存在的,
具体可以参考后面软件框架相关的章节。