精华内容
下载资源
问答
  • 我前面上传的《矢量图形系统开发与编程》不完整,给大家带来不便。为满足大家的需求,特意制作了pdf格式的完整版奉献给大家,希望能对大家有所帮助! 本书是矢量图形系统开发技术和VC++ 编程技术的集合体,并以矢量...
  • 第2章 计算机图形系统概述

    千次阅读 2018-06-26 16:18:36
    第2章 计算机图形系统概述 备注:*为重要内容 1. 第2章 计算机图形系统概述 1.1. 计算机图形系统 1.1.1. 组成 1.1.2. 基本功能 1.2. 图形显示设备 1.2.1. 显示器比较 1.2.2. 性能指标 1.3. 图形显示系统 ...

    第2章 计算机图形系统概述

    备注:*为重要内容

    1.1. 计算机图形系统

    1.1.1. 组成

    1. 硬件与软件示意图
      计算机图形系统组成
    2. 硬件
      • 输入设备
      • 输出设备
      • 存储设备
      • 图形处理设备
    3. 软件
      • 软件包
      • 应用程序
      • 应用模型

    1.1.2. 基本功能

    1. 计算:图形处理(如图形变换、光照等)
    2. 存储:远程和本机
    3. 输入:人机交互及数据文件等
    4. 输出:显示器、打印机等
    5. 对话图形:人机交互

    1.2. 图形显示设备

    显示器:

    (1)阴极射线管CRT CRT与彩色CRT【射线穿透、影孔板法】

    (2)平板型显示器

    1.2.1. 显示器比较

    1. 共同特点

      都是通过单个发光元素(点,像素)来显示图形或文字。
    2. 不同点

      (1)LCD体积小,厚度薄,重量轻,耗能少,无辐射。

      (2)CRT显示亮度高,色彩鲜艳,分辨率高。

    1.2.2. 性能指标

    • (1) 像素(Pixel: Picture Cell):构成屏幕(图像)的最小元素
    • (2) 分辨率(Resolution)

      CRT在水平或竖直方向单位长度上能识别的最大像素个数,单位通常为dpi(dots per inch) 在假定屏幕尺寸一定的情况下,也可用整个屏幕所能容纳的像素个数描述,如640*480,800*600, 1024*768,1280*1024 等等

    • (3) 分辨率越高显示的图形就越精细

    1.3. 图形显示系统

    1.3.1. 主要组成


    显示设备:显示器

    视频控制器:控制显示设备(有的含图形加速处理器),

    通过访问帧缓存来刷新屏幕

    显示缓冲器:可以在内存或显示控制器中

    1.3.2. 两种显示系统

    1.3.2.1. 随机扫描(random scan)

    电子束可以任意移动。画线设备
    (1) 特点
    电子束可随意移动,只扫描荧屏上要显示的部分像素
    对应的显示器为画线设备的
    (2) 逻辑部件
    刷新存储器(Refreshing Buffer)
    显示处理器( DPU: Display Processing Unit)
    CRT

    1.3.2.2. *光栅扫描(raster scan)

    电子束按固定扫描线和次序进行。画点设备

    • (1) 基本原理
      电子束按固定的扫描线和扫描顺序从左到右、自上
      而下进行扫描。
    • (2) 基本概念
      扫描线:一条水平线
      帧(frame): 1次扫描生成的图像
      水平回扫期:水平线间的回扫期
      垂直回扫期:帧间的回扫期
    • (4) 分辨率
      电子束按固定的扫描顺序进行扫描N条扫描线,每条扫
      描线有M个像素, M * N为显示器的分辨率
    • (5) 组成
    • 帧缓冲存储器(Frame Buffer)
    • 帧缓冲存储器
      简称帧缓存(显存中的部分存储单元)
    1. 作用:存储屏幕上像素的颜色值
    2. 帧缓存中单元数目与显示器上像素的数目相同,单元与像素一一对应,各单元的数值决定了其对应像素的颜色
    3. 显示颜色的种类与帧缓存中每个单元的位数有关

      如:黑白显示系统的帧缓冲器的每个单元只需一位。
    • 帧缓存容量

      分辨率M*N、颜色个数K 与缓存大小V的关系

      V ≥ M × N × ⌈ l o g 2 K ⌉ V\geq M×N×\left \lceil log_2K \right \rceil VM×N×log2K

      说明
    1. 一般像素颜色用RGB三基色表示
    2. 若每个帧缓存中每个存储单元有24位(每种基色占8位)即显示系统最多可表示产生224种颜色( 24位真彩色)
      例:颜色为真彩色、 分辨率是1024×1024的显示器,需要 1024 × 1024 × l o g 2 2 24 / 8 = 3 M B 1024×1024×log_22^{24}/8=3MB 1024×1024×log2224/8=3MB
    3. 若存储器容量固定,则屏幕分辨率与可用的颜色种数成反比关系
      问题:目前有的PC机的显存容量一般达256M以上,有必要? 原因:显存还包括深度缓存、纹理内存等
    • 视频控制器(Video Controller)
      建立帧缓存与屏幕像素之间的一一对应关系,负责刷新
      >普通显卡 = 视频控制器 + 显存

    • 显示处理器(Display Processor)
      代替CPU完成部分图形处理功能,
      >图形加速卡 = 视频控制器 + 显存 + 显示处理器

    • 显示器: CRT、液晶

    • (6) 特点

      • 优点
      • 成本低
      • 易于绘制填充图形
      • 色彩丰富
      • 刷新频率一定,与图形的复杂程度无关
      • 易于修改图形
      • 缺点
      • 需要扫描转换,复杂图形计算量大
      • 会产生混淆(走样)

    1.4. 图形基本软件系统

    1.4.1. 层次结构

    • 第一层次:面向硬件系统
      解决图形设备与计算机的通讯接口等问题,称为设备驱动程序

      设备驱动程序现在已被作为操作系统一部分,由操作系统或设备硬件厂商开发;
    • 第二层次:建立在驱动程序之上
      完成图元的生成、设备的管理等功能

      这个层次上的图形支撑软件已经标准化,如GKS、 PHIGS、 CGI等;
    • 第三层次:面向用户
      主要任务是建立图形数据结构,定义、修改和输出图形

      具有较强的交互功能,使用方便,容易阅读,便于维护和移植

      OpenGL、 Direct3D属于这一层次

    1.4.2. 面向用户图形系统的基本功能

    基本图形绘制(线画、填充图元等)

    图形变换

    几何变换

    投影变换

    图元着色

    光照效果

    纹理映射

    。。。

    作业

    1.简述光栅扫描显示系统的组成及各部分作用。
    帧缓冲存储器【存储各个像素的颜色值】,
    视频控制器【建立帧缓存与屏幕像素一一对应关系,负责刷新】,
    显示处理器【代替CPU完成部分图形处理功能】,
    显示器【显示输出】

    2.全高清指支持1080P输出显示的显示器,分辨率为1920×1080或更高。
    设一全高清显示器分辨率为1920×1080 ,每个像素的颜色值用24位表示,
    回答下列问题:
    (1)帧缓存的大小为多少?

    ( 1920 x 1080 x l o g 2 2 2 4 ) / 8 b = 5.94 M B (1920x1080x log_22^24 )/8b = 5.94MB (1920x1080xlog2224)/8b=5.94MB

    (2)目前PC机的显存大小为什么要比所求值大很多?
    显存还包括深度缓存以及纹理内存等
    (3) 一个16×16的窗口中的图形,最多同时可显示多少种颜色?
    16x16=256种
    3.选择一个正确答案
    (1)显示设备一般采用下列 颜色模型;
    A.CMY B. RGB C. HSV D. 都可以
    (2)下列物质中, 不是LCD需要的。
    A. 荧光物质 B. 光源 C. 液晶 D. 水平偏光板

    展开全文
  • 这个矢量图形系统是在书中介绍的图形系统Draw的基础上扩展功能开发完成的。主要扩展了图形块的制作功能,在矢量图形系统中绘制图例(插入图形块)的功能,图形选中功能,线型及颜色的设置功能,图层的设置管理功能,...
  • Linux环境下的图形系统简介

    千次阅读 2016-08-25 22:22:13
    Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后。开源社区开发开发了一些新的图形...

    Linux/Unix环境下最早的图形系统是Xorg图形系统,Xorg图形系统通过扩展的方式以适应显卡和桌面图形发展的需要,然而随着软硬件的发展,特别是嵌入式系统的发展,Xorg显得庞大而落后。开源社区开发开发了一些新的图形系统,比如Wayland图形系统。

          由于图形系统、3D图形本身的复杂以及历史原因,Linux下的图形系统相关的源码庞大而且复杂,而且缺少学习的资料(所有源代码分析或者驱动编程的书籍都很少介绍显卡驱动)。在后续一系列文章中,笔者将从对AMD硬件编程的角度出发对部分问题做一个简单的介绍,当然,这种介绍是很初级的,旨在希望能够对初学着有所帮助。

          内核DRM、Xorg以及Mesa三部分加起来的代码和整个Linux内核的体量是差不多大的。而且现代的显卡上的GPU的复杂程度在一定程度上可以和CPU相聘美,从程序员的角度看,操作系统(CPU的驱动)包含的许多功能在GPU驱动上都能够找到。比如,GPU有自己的指令系统,着色器程序(GLSL、HLSL、Cg这类着色语言)需要经过编译成GPU的指令集,然后才能够在GPU上运行,符合着色语言规范的3D驱动都包含一个编译器。3D应用程序需要使用大量内存,GPU在进行运算的时候需要访问这些内存,GPU在访问这些内存的时候也使用一套和CPU页表一样的机制。另外,在中断系统上,GPU和CPU也有相似之处。后面的一些内容将会陆续对这些问题做一个简单的介绍。

          传统上认为Linux是一个宏内核,设备驱动大部分都是包含在内核里面的,因此可以看到内核代码最庞大的部分是drivers目录,如果从kernel.org上面下载一个内核源码,直接编译,编译的时间大部分都耗在编译设备驱动上。

          微内核的操作系统,设备驱动不是内核的部分。这里不讨论微内核和宏内核的区别或者各自的优缺点。但是出于调试方便以及其他一些原因,Linux操作系统上面的一些驱动是放在核外的。一个主要的类别就是打印机、扫描仪这类设备,当前的打印机扫描仪通常都是通过USB 接口连接到计算机上的,对于这些设备的Linux驱动,除了USB核心部分在内核,这些打印机扫描仪本身的驱动都是在核外的。Linux上面的打印机使用CUPS系统,CUPS运行在核外,其驱动是按照CUPS的接口来开发的。Linux上面的扫描仪使用的是运行在核外的sane系统,其驱动是以动态链接库的形式存在的。另外一类核外的驱动是图形系统的驱动,由于图形系统、显卡本身比较复杂,而且由于一些历史原因,图形系统的驱动在核内核外都有,并且显卡驱动最主要的部分在核外。

          在wiki词条“Free and open-source graphics device driver”的最新页面上,对linux环境下的图形系统演变过程有一个很好的图解,这里直接使用这个页面的图进行描述 http://en.wikipedia.org/wiki/Free_and_open-source_graphics_device_driver

          显卡最早只有基本的显示功能,可以成为显示控制器(Display Controller)或者帧缓冲设备,对于这样的显示控制器,当前的Linux内核对其的支持表现为framebuffer驱动,Xorg部分对其的支持是一个名为fbdev的驱动。

     只有2D加速的图形系统

    图1

          其后显卡上逐渐加上了2D加速部件,这种情况下面的驱动如上图显示。这个情况下的架构还是比较简单的。

     添加了Utah GLX driver的图形系统

    图2

          随着3D图形显示和运算的需要,带有图形运算功能的显卡出现,这个时候需要有专门的3D驱动来处理3D,于是出现了上图的GLX driver,这里注意到X server依然处在一个中心节点的位置,无论是X11程序还是3D OpenGL程序,都要通过X server才能到底层。同时注意到到现在为止X的2D driver和GLX driver都是直接调用到硬件,而没有通过内核调用。在2.6版本的内核的系统上,依然能看到X 2D driver中有访问硬件有MMIO和CP两套代码,MMIO就是这里的情况,显卡寄存器直接暴露给核外的2D driver(和GLX driver,目前已经不存在这个了)。

          这种情况下的结构仍然是比较简单的,然而这种情况有一个很大的问题,读过X server代码的(或者参考这篇文章“X Window System Internals”http://xwindow.angelfire.com/)应该知道,X server是单线程的(关于多线程X server,可以google到一些邮件讨论记录),main函数完成系统初始化之后就进入了一个循环,等待客户端程序的连入,等一个客户端程序发送完数据之后其他的客户端才能连上来,OpenGL客户端程序每次要请求硬件都必须先经过X server,然后由X server“代表”OpenGL程序进入硬件,对于场景稍微复杂的3D应用程序来说,这样频繁的和X server交互是难以保证3D渲染的实时性的。

          鉴于上面的问题,引入了DRI机制,在这个机制下面,OpenGL程序对硬件的请求不再经过X server,而是自己直接和硬件交互。整个过程是这样的:在绘图之前,OpenGL程序向内核申请到一片渲染目标并告诉X server,然后OpenGL程序不经过X server而直接调用进内核请求硬件进行渲染操作,并将结果渲染到申请到的渲染目标中,渲染结束后,OpenGL程序通知X server该渲染目标发生了变化,对应的屏幕上的窗口区域需要进行更新,X server收到这个通知后,进行一次重新的窗口混合工作(当前代码是EXA的Composite功能提供的)。这个时候的情况如下图示,GLX driver被DRI driver取代,和Dri driver交互的不再是X server而直接是OpenGL程序。另外DRI(原来是GLX)不直接操作硬件,而是通过内核drm驱动操作硬件,drm提供硬件访问通道和访问机制。在当前的系统上,2D driver以EXA 2D加速驱动的形式存在于Xorg里面,DRI driver则在Mesa中。

     DRI架构的图形系统

    图3

           然后又添加了对远程3D client的支持AIGLX,这部分的功能和原来的Utah GLX有类似之处。AIGLX可以参考wiki页面(http://en.wikipedia.org/wiki/AIGLX)。

     添加了AIGLX的图形系统

    图4

           X server通过不断扩展形成了现在的样子,显得庞大而且复杂,有些工作是不必要的。开源社区提出了更为简洁的wayland图形系统,在“揭开Wayland的面纱(一)(二)”两篇文章里面对wayland做了说明,读者可以点击下面的地址:

          http://www.ibentu.org/2010/11/06/introduce-to-wayland-01.html

          http://www.ibentu.org/2010/11/06/introduce-to-wayland-01.html

     Wayland图形系统架构

    图5

          在这两篇文章里面描述了这么一个场景:在一个图形程序上点击某个按钮。在X图形系统下,X的evdev驱动捕获到这个信息,X被告知有应用程序需要进行渲染,然后X server查询到需要渲染的窗口,然后将“鼠标点击”这个事件通知给需要渲染的窗口对应的X程序,X程序接收到通知后再告诉X server“如何进行渲染”,X server接收到“如何渲染”的消息后进行渲染(2D情况下X/EXA自己完成,3D情况下无需先通知X server,使用DRI完成绘制并由应用程序告知X渲染已经完成),完成通知X的“composite”扩展进行混合,X的composite扩展接到混合请求后告知X server混合已经完成,这里面X server和X client以及X server和X composite之间都有双向的通信,这两部分是比较耗时的,而且由于X server通知X composite之前还需要进行窗口的重叠判断、被覆盖窗口的剪载计算等——然而这些是X composite不需要的,因此会有一些额外的时间消耗。

          在Wayland情况下,server主要进行composite,应用程序全部使用DRI直接渲染机制,完成后通知Server(composite)进行混合,结构上非常简单而且高效。

          另外对窗口的请求也发生了变化,在X DRI下,X11和3D程序需要向X server请求窗口,那个时候X server进行的加速操作必须依赖单独的EXA驱动(无法直接调用OpenGL加速),后来的mesa做了一些修改,在wayland环境下,Application直接通过EGL、GLES driver向内核drm请求绘图窗口,而这里的composite可以直接调用OpenGLES进行加速,而无需单独有2D加速驱动。

          还注意到,内核里面有一个KMS,全称是kernel mode setting(内核模式设置,设置显示分辨率之类的),前面曾经提到过,早期的显卡寄存器是直接暴漏给核外驱动的,直到现在的EXA内核代码里面仍然有MMIO和CP两种操作方式,早期X进行模式设置的时候直接写寄存器进行操作,后来内核引入了KMS(在wayland之前就已经有了),于是核外驱动可以通过调用KMS接口进行模式操作而不需要了解硬件细节。

          上面提到了composite,X的composite的操作如下图示:

     Composite

    图6

          过去的X11 client直接在显示区域上,现在X11 client窗口在off-screen显存上,compositor从这些显存上取出内容并最终混合到显示区域上去。X里面和composite操作相关的扩展有damage、render、composite,这三者描述参考以下资料:

          http://cgit.freedesktop.org/xorg/proto/compositeproto/plain/compositeproto.txt

          http://cgit.freedesktop.org/xorg/proto/damageproto/plain/damageproto.txt

          http://cgit.freedesktop.org/xorg/proto/renderproto/plain/renderproto.txt

          关于X composite的引入过程读者可以参考以下资料:

          Keith Packard. Design and Implementation of the X Rendering Extension

          Matthieu Herrb, Matthias Hopf. New Evolutions in the X Window System

          Andy Ritger. Using the Existing XFree86/X.Org Loadable Driver Framework to Achieve a Composited X Desktop

           当前的Linux环境上的图形系统架构如下图示:

     Linux环境下的图形系统架构

    图7

          这里的部分内容在前面描述过了,需要注意的是X server的EXA驱动部分出现了glamor,glamor直接调用到了mesa里面,过去EXA驱动是单独的驱动,通过drm调用操作硬件,而由于mesa的改变,X可以和wayland composite一样直接调用Mesa的接口。

          后面的描述将针对Fedora 16操作系统,Fedora 16系统和现在最新的系统(图7)有一定的区别,后面的一些问题的讨论主要使用图4。在后续blog中,将先对Fedora的图形系统内核、X、Mesa这个层次的部分进行一个简单的描述,然后开始介绍驱动对AMD显卡硬件部分模块(功能)的编程。

     

    其他参考资料:

    Inside Linux graphics 是intel的开发人员编写的一份介绍图形架构的文档。

    Linux Graphics Drivers: an Introduction 是开源社区的开发人员写的一份文档,对Linux图形系统的各个方面都有一些介绍。

    A deeper look into GPUs and the Linux Graphics Stack 这一份ppt对图形系统架构有比较深入的探讨。

    Graphics Card Interfaces 这篇博文对图形架构的部分细节有一些探讨。

    精通嵌入式Linux编程:构建自己的GUI环境 这本书描述了如何在framebuffer上构建一个完整的图形系统,其中的许多概念和原理在X图形系统中也能够看到。

    展开全文
  • linux图形系统框架

    千次阅读 2016-10-18 14:20:29
    图形系统是linux系统中比较复杂的子系统之一:对下,它要管理形态各异的、性能各异的显示相关的器件;对上,它要向应用程序提供易用的、友好的、功能强大的图形用户界面(GUI)。因此,它是linux系统中少有的、和...

    转载网址:http://www.wowotech.net/graphic_subsystem/graphic_subsystem_overview.html

    1. 前言

    图形子系统是linux系统中比较复杂的子系统之一:对下,它要管理形态各异的、性能各异的显示相关的器件;对上,它要向应用程序提供易用的、友好的、功能强大的图形用户界面(GUI)。因此,它是linux系统中少有的、和用户空间程序(甚至是用户)息息相关的一个子系统。

    本文是图形子系统分析文章的第一篇,也是提纲挈领的一篇,将会从整体上,对linux显示子系统做一个简单的概述,进而罗列出显示子系统的软件构成,后续的文章将会围绕这些软件一一展开分析。

    注1:本文所有的描述将以原生linux系统为例(如Ubuntu、Debian等),对其它基于linux的系统(如Android),部分内容会不适用。

    注2:本文很多图片都是从网上搜集而来的(很多是从维基百科)。虽然蜗窝的宗旨是用自己的语言表述,尽量自己画图,但是linux图形子系统太复杂了,蜗蜗的理解有限,而老外的图画的实在太好,蜗蜗觉得,再怎么努力,也画不出更好的了,因此本着为读者负责的态度,就直接copy了。

    2. 概念介绍

    2.1 GUI(Graphical User Interface,图形用户界面)

    linux图形子系统的本质,是提供图形化的人机交互(human-computer interaction)界面,也即常说的GUI(Graphical User Interface)。而人机交互的本质,是人脑通过人的输出设备(动作、声音等),控制电脑的输入设备,电脑经过一系列的处理后,经由电脑的输出设备将结果输出,人脑再通过人的输入设备接收电脑的输出,最终实现“人脑<-->电脑”之间的人机交互。下面一幅摘自维基百科的图片(可从“这里”查看比较清晰的SVG格式的原始图片),对上述过程做了很好的总结:

    Linux_kernel_INPUT_OUPUT_evdev_gem_USB_framebuffer.svg

    该图以一个非常前卫的应用场景----虚拟现实(VR,Virtual Reality)游戏,说明了以图形化为主的人机交互过程:

    1)人脑通过动作、声音(对人脑而言,是output),控制电脑的输入设备,包括键盘、鼠标、操作杆、麦克风、游戏手柄(包含加速度计、陀螺仪等传感器)。

    2)电脑通过输入设备,接收人脑的指令,这些指令经过kernel Input subsystem、Middleware Gesture/Speech recognition等软件的处理,转换成应用程序(Game)可以识别的、有意义的信息。

    3)应用程序(Game)根据输入信息,做出相应的反馈,主要包括图像和声音。对VR游戏而言,可能需要3D rendering,这可以借助openGL及其相应的用户空间driver实现。

    4)应用程序的反馈,经由kernel的Video subsystem(如DRM/KMS)、audio subsystem(如ALSA),输出到电脑的输出设备上,包括显示设备(2D/3D)、扬声器/耳机(3D Positional Audio)、游戏手柄(力的反馈)等。

    5)输出到显示设备上时,可能会经过图形加速模块(Graphics accelerator)。

    注3:图中提到了VR场景的典型帧率(1280×800@95fps for VR),这是一个非常庞大的信息输出,要求图形子系统能10.5ms的时间内,生成并输出一帧,以RGBA的数据格式为例,每秒需要处理的数据量是1280x800x95x4x8=3.11296Gb,压力和挑战是相当大的(更不用提1080P了)。

    有关GUI更为详细的解释,请参考:https://en.wikipedia.org/wiki/Graphical_user_interface

    2.2 Windowing system(窗口系统)

    窗口系统,是GUI的一种(也是当前计算机设备、智能设备广泛使用的一种),以WIMP (windows、icons、menus、pointer) 的形式,提供人机交互接口。Linux系统中有很多窗口系统的实现,如X Window System、Wayland、Android SurfaceFlinger等,虽然形态各异,但思路大致相同,包含如下要点:

    1)一般都使用client-server架构,server(称作display server,或者windows server、compositor等等)管理所有输入设备,以及用于输出的显示设备。

    2)应用程序作为display server的一个client,在自己窗口(window)中运行,并绘制自己的GUI。

    3)client的绘图请求,都会提交给display server,display server响应并处理这些请求,以一定的规则混合、叠加,最终在有限的输出资源上(屏幕),显示多个应用程序的GUI。

    3)display server和自己的client之间,通过某种类型的通信协议交互,该通信协议通常称作display server protocol。

    4)display server protocol可以是基于网络的,甚至是网络透明的(network transparent),如X Window System所使用的。也可以是其它类型的,如Android SurfaceFlinger所使用的binder。

    有关Windowing system的详细解释,请参考:https://en.wikipedia.org/wiki/Windowing_system

    2.3 X Window System

    似乎终于要进入正题了。

    X Window System是Windowing System一种实现,广泛使用于UNIX-like的操作系统上(当然也包括Linux系统),由MIT(Massachusetts Institute of Technology,麻省理工学院)在1984年发布。下图(可从“这里”查看比较清晰的SVG格式的原始图片)是它的典型架构:

    X_client_server_example

    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等扩展,后面会介绍)的绘图请求。

    有关X更为详细的介绍,请参考:https://en.wikipedia.org/wiki/X_Window_System,后续蜗蜗可能会在单独的文章中分析它。

    2.4 窗口管理器、GUI工具集、桌面环境及其它

    前面讲过,X作为Windowing system中的一种,只提供了实现GUI环境的基本框架,其它的UI设计所需的button、menu、window title-bar styles等基本元素,则是由第三方的应用程序提供。这些应用程序主要包括:窗口管理器(window manager)、GUI工具集(GUI widget toolkit)和桌面环境(desktop environment)。

    窗口管理器负责控制应用程序窗口(application windows)的布局和外观,使每个应用程序窗口尽量以统一、一致的方式呈现给用户,如针对X的最简单的窗口管理程序--twm(Tab Window Manager)。

    GUI工具集是Windowing system之上的进一步的封装。还是以X为例,它通过xlib提供给应用程序的API,仅仅可以绘制基本的图形单元(点、线、面等等),这些基本的图形单元,要组合成复杂的应用程序,还有很多很多细碎、繁杂的任务要做。因此,一些特定的操作系统,会在X的基础上,封装出一些更为便利的GUI接口,方便应用程序使用,如Microwindows、GTK+、QT等等。

    桌面环境是应用程序级别的封装,通过提供一系列界面一致、操作方式一致的应用程序,使系统以更为友好的方式向用户提供服务。Linux系统比较主流的桌面环境包括GNOME、KDE等等。

    2.5 3D渲染、硬件加速、OpenGL及其它

    渲染(Render)在电脑绘图中,是指:用软件从模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。图像是数字图像或者位图图像。

    上面的定义摘录自“百度百科”,它是着重提及“三维物体”,也就是我们常说的3D渲染。其实我们在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的一个重要特性,是独立于操作系统和窗口系统而存在的,具体可以参考后面软件框架相关的章节。

    3. 软件框架

    通过第2章的介绍,linux系统中图形有关的软件层次已经呼之欲出,具体如下:

    display_software_layer

    该层次图中大部分的内容,已经在第2章解释过了,这里再补充说明一下:

    1)该图片没有体现3D渲染、硬件加速等有关的内容,而这些内容却是当下移动互联、智能化等产品比较关注的地方,也是linux平台相对薄弱的环节。后续会在软件框架有关的内容中再着重说明。

    2)从层次结构的角度看,linux图形子系统是比较清晰的,但牵涉到每个层次上的实现的时候,就比较复杂了,因为有太多的选择了,这可归因于“提供机制,而非策略”的Unix软件准则。该准则为类Unix平台软件的多样性、针对性做出了很大的贡献,但在今天这种各类平台趋于整合的大趋势下,过多的实现会导致用户体验的不一致、开发者开发精力分散等弊端,值得我们思考。

    3)虽然图形子系统的层次比较多,但不同的人可能关注的内容不太一样。例如对Linux系统工程师(驱动&中间件)而言,比较关注hardware、kernel和display server这三个层次。而对Application工程师来说,可能更比较关心GUI Toolkits。本文以及后续display subsystem的文章,主要以Linux系统工程师的视角,focus在hardware、kernel和display server(可能包括windows manager)上面。

    以X window为例,将hardware、kernel和display server展开如下(可从“这里”查看比较清晰的SVG格式的原始图片):Linux_Graphics_Stack_2013.svg

    From: https://upload.wikimedia.org/wikipedia/commons/c/c2/Linux_Graphics_Stack_2013.svg

    对于软件架构而言,这张来自维基百科的图片并不是特别合适,因为它包含了太多的细节,从而显得有些杂乱。不过瑕不掩瑜,对本文的描述,也足够了。从向到下,图中包括如下的软件的软件模块:

    1)3D-game engine、Applications和Toolkits,应用软件,其中3D-game engine是3D application的一个特例。

    2)Display Server

    图片给出了两个display server:Wayland compositor和X-Server(X.Org)。X-Server是linux系统在PC时代使用比较广泛的display server,而Wayland compositor则是新设计的,计划在移动时代取代X-Server的一个新的display server。

    3)libX/libXCB和libwayland-client

    display server提供给Application(或者GUI Toolkits)的、访问server所提供功能的API。libX/libXCB对应X-server,libwayland-client对已Wayland compositor。

    4)libGL

    libGL是openGL接口的实现,3D application(如这里的3D-game engine)可以直接调用libGL进行3D渲染。

    libGL可以是各种不同类型的openGL实现,如openGL(for PC场景)、openGL|ES(for嵌入式场景)、openVG(for Flash、SVG矢量图)。

    libGL的实现,既可以是基于软件的,也可以是基于硬件的。其中Mesa 3D是OpenGL的一个开源本的实现,支持3D硬件加速。

    5)libDRM和kernel DRM

    DRI(Direct Render Infrastructure)的kernel实现,及其library。X-server或者Mesa 3D,可以通过DRI的接口,直接访问底层的图形设备(如GPU等)。

    6)KMS(Kernel Mode Set)

    一个用于控制显示设备属性的内核driver,如显示分辨率等。直接有X-server控制。


    展开全文
  • Android图形系统的底层实现

    千次阅读 2015-02-05 09:07:54
    Android图形系统的底层实现 本文试图讲述Android图形系统的底层实现。Android图形系统底层实现非常复杂,文档较少,没有使用比较流行的图形组建如X window, Cairo等。 原文位置:...

    Android图形系统的底层实现

    本文试图讲述Android图形系统的底层实现。Android图形系统底层实现非常复杂,文档较少,没有使用比较流行的图形组建如X window, Cairo等。

    原文位置:http://blog.sina.com.cn/s/blog_5e71b14f0100c75g.html~type=v5_one&label=rela_nextarticle



    Android中的图形系统采用Client/Server架构。Server (即SurfaceFlinger)主要由c++代码编写而成。Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层实现。下图概要介绍了android图形系统的架构以及使用到的主要组件。



    Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。每个canvas对象对应一个bitmap,存储画在surface上的内容。

    每个Surface通常对应两个buffer,一个front buffer, 一个back buffer。其中,back buffer就是canvas绘图时对应的bitmap (研究android_view_Surface.cpp::lockCanvas)因此,绘画总是在back buffer上,需要更新时,则将back buffer和front buffer互换。

    The window is tied to a Surface and the ViewRoot asks the Surface for a
    Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot
    will call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces() which do the actually display to  display panel.  SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer

    Except for SurfaceViews, different views within the same ViewRoot share the same surface.

    Layer的概念:

    每个surface又对应一个layer, SurfaceFlinger负责将各个layer的front buffer合成(composite)绘制到屏幕上。
    A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don't have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer
     
    Multiple layers are just composited to the final buffer in  their Z order.


    有几个对象与Surface概念紧密相关:
    1. Java Surface (frameworks/base/core/java/android/view/Surface.java)。该对象被应用间接调用(通过SurfaceView, ViewRoot等), 应用需要创建surface,(并同时创建canvas), 将图形绘制到这个对象上并最终投递到屏幕上。
    2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被Java Surface通过Jni 调用,实现Java Surface 的功能
    3. ISurface (以及其派生类BnSurface)。这个对象是应用和server之间的接口。C++ Surface创建这个ISurface (BnSurface)并发送命令,如更新surface内容到屏幕上。Server端接受这个命令并执行相应操作。

    研究一个surface如何创建的关键路径如下:
    1. frameworks/base/core/java/android/view/Surface.java -- Surface::Surface ()
    2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。在这个函数中SurfaceComposerClient 对象被创建。
    3. frameworks/base/libs/ui/SurfaceComposerClient.cpp -- SurfaceComposerClient::SurfaceComposerClient (). 这个函数非常重要,在这里建立了client和server之间的桥梁。通过函数_get_surface_manager()获得了一个指向server的IBinder 对象(具有ISurfaceComposer接口),之后通过这个IBinder就可以跨进程访问Server的功能。接着调用ISurfaceComposer::createConnection()创建并返回了一个ISurfaceFlingerClient的IBinder。
    4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -- SurfaceComposerClient::createSurface().这个函数中,利用前面获得的ISurfaceFlingerClient的IBinder,调用其createSurface接口。
    5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -- BClient::createSurface ()。BClient由ISurfaceFlingerClient派生而来。
    6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -- SurfaceFlinger:: createSurface()。这个函数为Surface创建一个对应的Layer。

    上述关键路径中,1,2,3,4运行于client进程中,而5,6运行与server进程中。server作为一个service提供给client访问。

    与图形相关的代码主要位于下列目录:
    1、frameworks/base/graphics/java/android/graphics
    2、frameworks/base/core/java/android/view
    3、frameworks/base/core/java/android/widget
    4、frameworks/base/opengl/
    5、frameworks/base/libs/ui
    6、frameworks/base/libs/surfaceflinger
    7、frameworks/base/core/jni/android/graphics
    8、frameworks/base/core/jni/android/opengl
    9、frameworks/base/core/jni/android/android_view_*.cpp
    10、external/skia


    一、下列目录中的部分代码:
    1、frameworks/base/graphics/java/android/graphics
    2、frameworks/base/core/java/android/view
    3、frameworks/base/core/java/android/widget

    android.graphics, android.view和android.widget功能和其他类似的图形库如Qt/Gtk+差不多,分别提供基本的图形原语(如画点画线,设置图形上下文等),事件机制,以及开发图形用户界面的控件等。canvas 用于开发2D图形, Surface 代表一个可供图形系统绘制的surface。可在其上绘制2D活3D图形。


    二. frameworks/base/opengl/
    这个目录包含opengel的接口以及软件实现。在http://developer.android.com/guide/topics/graphics/opengl.html有详细介绍如何使用android.opengl开发3d graphics。

    三.external/skia,台湾的Jserv先生有一篇比较好的介绍,感兴趣的读者可以参考他的博文(http: //blog.linux.org.tw/~jserv/archives/002095.html)。简而言之,skia与cairo功能相当,封装底层的图形硬件,为上面的图形库提供最基础的操作图形硬件的原语。

    四. frameworks/base/libs/ui 和 frameworks/base/libs/surfaceflinger
    ISurface 定义了基础的Surface接口,供图形系统客户端(应用)和server端(即surfaceflinger)交互。
    BpSurface是ISurface的派生类,提供接口供server 调用客户端功能;
    BnSurface是ISurface的另一个派生类,提供接口供客户端调用server功能。当 server 收到来自客户端(通过BnSurace)的调用请求后,如registerBuffers, postBuffer等,BnSurface::onTransact被触发。
    Surface (LayerBaseClient的私有类)是BnSurface的派生类。
    SurfaceBuffer (SurfaceBuffer的私有类)是Surface的派生类。

    ISurfaceComposer 定义了基础的接口,供客户端和server端交互。
    BpSurfaceComposer是一个派生类,提供接口供server调用客户端功能;
    BnSurfaceComposer是另一派生类,提供接口供客户端调用server功能。类 SurfaceFlinger 由BnSurfaceComposer派生而来。

    SurfaceComposerClient直接供客户端使用,调用ISurface (BnSurface)和 ISurfaceComposer (BnSurfaceComposer)以及 ISurfaceFlingerClient 接口,与server交互。

    BClient 派生自ISurfaceFlingerClient (BnSurfaceFlingerClient),调用server的createSurface,真正创建一个surface。每个surface对应一个layer.

    egl_native_window_t 定义了一个本地window类 。这个类提供了对本地window的所有描述以及用于egl (opengl 与本地图形系统的接口)操作本地windwo的所有方法。
    EGLNativeSurface是egl_native_window_t的一个派生类。
    EGLDisplaySurface是EGLNativeSurface的派生类。 EGLDisplaySurface 是一个非常重要的类,在这个类里,真正打开framebuffer设备(/dev/graphics/fb0 或者/dev/fb0),并将这个设备封装成EGLDisplaySurface的形式供server使用。函数mapFrameBuffer打开framebuffer, 创建两个缓冲区,(一个是on screen front 缓冲区, 另一个back buffer, 可能位于offscreen framebuffer,也可能位于系统内存)。 函数swapBuffers将back buffer内容拷贝到front buffer中。

    DisplayHardware 类中初始化了egl系统,并为本地窗口对象EGLDisplaySurface 创建了对应的EGLSurface 对象。surfaceflinger 使用DisplayHardware去和本地窗口打交道。



    五、下列目录中的部分代码
    7、frameworks/base/core/jni/android/graphics
    8、frameworks/base/core/jni/android/opengl
    9、frameworks/base/core/jni/android/android_view_*.cpp

    这些目录下的代码在Java层的graphics 组件和native (c++)组件之间衔接,将java层的功能调用转换到对应的本地调用。

    hardware/libhardware实现了HAL(Hardware Abstraction Layer)层,copybit device是其中一个模块。

    展开全文
  • 第二章 图形系统的基本功能和组成

    千次阅读 2012-12-11 22:17:25
    图形系统的基本功能 1. 图形输入(键盘、光笔) 2. 图形计算 3. 图形交互:(人可以干预) 4.图形输出 5.图形存储 图形系统硬件 图形硬件设备分类 输入设备:键盘,鼠标,跟踪球和空间球,操纵杆,数字化...
  • Android图形显示系统(一)

    万次阅读 多人点赞 2017-05-03 17:03:02
    本文讲解的内容是Android4.1以后的系统机制,将从整体上分析Android图形显示系统的结构,不深入分析每一层内部的代码实现,更多的是使用流程图和结构图来让大家理解Android是如何绘制、合成图形并显示到屏幕上。...
  • linux下的X11图形系统介绍之XWindows

    千次阅读 2011-06-07 21:08:00
    X Windows 系统于1984年在麻省理工学院(MIT)电脑科学研究室开始开发的,当时Bob Scheifler正在发展分散式系统(distributed system),同一时间 DEC公司的 Jim Gettys 正在麻省理工学院做 Athena 计划的一...
  • 基于ESP-ADF的图形系统

    千次阅读 2021-10-14 15:40:23
    LinkGUI™ Air E32让开发者可以在ESP32芯片上实现完美的图形...LinkGUI™ Air E32 平台由ESP32 WROVER和LCD、5个按键、T卡插槽、喇叭插槽、麦克风与扩展接口所构成,它的SDK是以基于ESP-ADF的LinkGUI图形系统为核...
  • 文章目录图形系统显示系统Buffer管理显示系统的架构从应用的角度理解Android Android图形显示子系统概述 Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示...
  • Android 图形系统剖析

    千次阅读 2009-12-19 10:37:00
    架构Android 中的图形系统采用 Client/Server 架构。Server (即SurfaceFlinger) 主要由 C++ 代码编写而成。Client 端代码分为两部分,一部分是由 Java 提供 的供应用程序使用的 API,令一部分则是用 C++ 写成的底层...
  • Surface Manager是用户空间中framework下libraries中负责显示相关的一个模块,当系统同时执行多个应用程序时,SurfaceManager会负责管理显示与存取操作间的互动,另外也负责将2D绘图与3D绘图进行显示上的合成。...
  • 操作系统 图形窗口 子系统

    千次阅读 2012-10-14 16:22:21
    Windows 子系统 按照Windows NT 最初的设计,它支持三个环境子系统:OS/2、POSIX 和Windows(或称为Win32)。然而,Windows 子系统是必须要运行的,没有它Windows 系统无法运行,而其他两个子系统则被配置成按需...
  • 这是财务管理系统的一个图形化界面主菜单 ; 下面这个是查询功能的一个子菜单; 一: 菜单的实现靠的是easyX,它是针对C++的一个图形库,编译器用的是Visual C。其实VC和easyX图形库就很容易上手制作一个鼠标点击...
  • 在商店安装之后的KaliLinux源都是非常原始的,基本所有apt-get都会显示找不到,于是折腾了一下源 ...看来win10下KaliLinux还是没有那么理想的,无法原生图形界面启动,适合纯命令行,要体验纯正Linux还是要硬件安装
  • 基于MFC实现的图形绘图编辑系统

    千次阅读 2019-07-24 19:12:00
    一、课程设计目的 学完《C语言程序设计》和《面向对象可视化编程》两门课程...编写一个简单的图形编辑MFC程序,可以添加,修改与删除图形元素,以形成图形画面,如图2-1所示 点击此处下载文档和源码  
  • 计算机图形学导论

    千次阅读 多人点赞 2018-10-12 22:42:46
    计算机图形学概念 1.1什么是计算机图形学?(Computer Graphics) 关于计算机图形学的定义众说纷纭。 IEEE 对计算机图形学的定义为:Computer graphicsis the art or science of producing graphical images with...
  • initgraph:初始化图形系统

    千次阅读 2006-05-26 15:28:00
    initgraph【功能】初始化图形系统。【原型】void far initgraph ( int far *graphdriver, int far *graphmode, char far *pathtodriver)【位置】graphics.h ★图形模式的初始化★ 不同的显示器适配器有不同的图形...
  • 远程桌面时不小心选错服务器,还没连接上直接关闭,系统DOWN机,连接上显示器,发现卡死,一串乱码(当时心大想着重启就好了无拍照),重启后仍无法启动,悲剧鸟! 你没看错,这是服务器,修不好只能跑路了,不然...
  • Android系统软件架构图如图1所示:图1 Android系统软件架构图 其中蓝色部分和显示相关。同时在Surface Manager所在的核心服务层和Display Driver所在的操作系统内核层中间还存在着一层硬件抽象层,里面包含gralloc...
  • 计算机图形学复习小抄

    千次阅读 2017-05-01 21:13:37
    1、一个交互式计算机图形系统应具有  计算  、  存储  、  交互  、 输入  、  输出 等五个方面的功能。 2、形体的定义和图形的输入输出都是在一定的坐标系下进行的 通常这些坐标系分为...
  • Windows 10下Linux子系统安装图形界面

    千次阅读 2019-03-10 17:11:16
    更新 sudo apt-get update ...远程桌面连接,点击进入,输入本机IP:端口,以及子系统用户名(在步骤2中,终端窗口@符号之前)   *每次远程连接之前都要在终端中启动xrdp,并且窗口不能关闭。 转载链接: ...
  • 这里的Kernel空间(与Display相关)是Linux平台下的FB设备。下面介绍一下FB设备。...FrameBuffer 是一种能够提取图形的硬件设备,是用户进入图形界面很好的接口。有了FrameBuffer,用户的应用程序不需要对底层驱动有深
  • 操作系统图形界面发展史(1981-2009)

    万次阅读 2016-08-03 11:53:15
    注意,本文这罗列了从1981年以来有重大意义的操作系统图形界面。 首先,先介绍两个网站: http://www.guidebookgallery.org/ 如果你比较关注图形化UI的设计, 可以上这个网站上看看。...
  • 如果系统想要以某种方式启动,使用systemd创建符号链接指向默认运行级别 修改方法为: (1)删除已经存在的符号链接: rm /etc/systemd/system/default.target (2)默认级别转换为文本模式(级别为3): ln -sf /...
  • 系统资源监控器,实时读取系统各硬件的使用情况,并以图形界面直观的显示出来!系统资源监控器,实时读取系统各硬件的使用情况,并以图形界面直观的显示出来!系统资源监控器,实时读取系统各硬件的使用情况,并以...
  • 虽然习惯了Linux下命令行操作的老鸟们对于图形界面系统并不是那么期待,但是菜鸟们还是希望能够有图形系统,这样心理上能有一些安慰,下面就图解如何在CentOS 7上安装图形系统: Step 1:通过SecureCRT连接到Linux....
  • JAVA小项目-银行管理系统图形界面&&文件读写+源文件)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 730,052
精华内容 292,020
关键字:

图形系统