没有合适的资源?快使用搜索试试~ 我知道了~
Android_图形系统分析-surfaceFlinger流程
4星 · 超过85%的资源 需积分: 44 44 下载量 57 浏览量
2011-06-14
10:54:13
上传
评论
收藏 907KB DOC 举报
温馨提示
试读
23页
Android_图形系统分析-surfaceFlinger流程 ,感觉不错的一篇文章
资源推荐
资源详情
资源评论
第一章Android GDI 之基本原理及其总体
框架
Android GDI 基本框架
在 Android 中所涉及的概念和代码最多,最繁杂的就是 GDI 相关的代码了。但是本质
从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理。
GDI 主要管理图形图像的输出,从整体方向上来看,GDI 可以被认为是一个物理屏幕使用的
管理器。因为在实际的产品中,我们需要在物理屏幕上输出不同的窗 口,而每个窗口认为
自己独占屏幕的使用,对所有窗口输出,应用程序不会关心物理屏幕是否被别的窗口占用
而只是关心自己在本窗口的输出,至于输出是否能在 屏幕上看见,则需要 GDI 来管理。
从最上层到最底层的数据流的分析可以看到实际上 GDI 在上层为 GUI 提供一个抽象的
概念,就好像操作系统中的文件系统所提供文件,目录等抽象概念一 样,GDI 输出抽象成了
文本,画笔,位图操作等设备无关的操作,让应用程序员只需要面对逻辑的设备上下文进行输
出操作,而不要涉及到具体输出设备,以及输 出边界的管理。GDI 负责将文本、线条、位图
等概念对象映射到具体的物理设备,所以 GDI 的在大体方向上可以分为以下几大要素:
画布
字体
文本输出
绘画对象
位图输出
Android 的 GDI 系统
Android 的 GDI 系统所涉及到概念太多,加之使用了 OpenGL 使得 Android 的层次和代
码很繁杂。但是我们对于 Android 的 GDI 系统需要了解的方面不是他的静态的代码关系,
而是动态的对象关系,在逻辑运行的架构上理解 GDI。我们首先还是需要从代码结构开始
我们的理解。
Frameworks/Libs/Surfaceflinger
Frameworks/base/core/jni/android_view_Surface.cpp
Frameworks/base/core/java/android/view/surface.java
Frameworks/base/Graphics:绘图接口
Frameworks/Libs/Ui
External/Skia
其中 External/Skia 是一个 C++的 2D 图形引擎库,Android 的 2D 绘制系统都是建立在
该基础之上.Skia 完成了:文本输出,位图,点,线,图像解码等功能。在这里给出
Android GDI 的基本框架示意图。
对于上面的 GDI 架构图我们只是一个大概的了解,我们有太多的问题需要解决,有太多
的疑问需要得到答案,我就一直在想,为什么设计者有提出如此众多的概 念,这个概念的
背景是什么?他要管理什么,他要抽象什么?从前面知道,Android 的整个设计理念就是无
边 界 化 , 他 是 如 何 穿 透 Linux 进 程 这 个 鸿 沟 来 达 到 无 边 界 的 ? Surface , Canvas ,
Layer,LayerBase, NativeBuffer,SurfaceFlinger,SurfaceFlingerClient 这些到底是一个什么
东西?如何管理,传递的是什么? 创建的是什么?这些都是抽象的概念,绘画的终极的缓
冲区到底是如何管理的?缓冲区到底在哪里?
我们还是看看做终极的,最本质的设计概念,在从这些概念出发,来探讨这些概念的形
成过程,是否有必要去生成写概念。SurfaceFlinger 本质上干 什么的?SurfaceFlinger 的确就
是这个意义:应用程序通过 SurfaceFlinger 将自己的“Surface”投掷到屏幕缓冲区。至于如何
投掷的,我们将会在后面详细描述。
第二章Android GDI 之显示缓冲管理
Android GDI 之屏幕设备管理-动态链接库
万丈高楼从地起,从最根源的硬件帧缓冲区开始。我们知道显示 FrameBuffer 在系统中
就是一段内存,GDI 的工作就是把需要输出的内容放入到该段内存的某个位置。我们从基本
的点(像素点)和基本的缓冲区操作开始。
1 基本知识
1.1 点的格式
对于不同的 LCD 来讲,FrameBuffer 的二进制格式不一样,并且可以分为两部分:
1)点的格式:通常将 Depth,即表示多少位表示一个点。
1 位表示一个点
2 位表示一个点
16 位表示一个点
32 位表示一个点(Alpha 通道)
2) 点内格式:RGB 分量分布表示。
例如对于我们常见的 16 位表示一个点
1.2 格式之间的转换
所以屏幕输出实际上是一个值映射的关系。我们可以有如下的点格式转换,
源格式可能来自单色位图和彩色位图,对于具体的目标机来讲,我们的目标格式可能
就是一种,例如 16 位(5/6/5)格式。其实就只存在一种格式的转换,即从目标格式都是
16 位格式。
但是,在设计 GDI 时,基本要求有一个可移植性好,所以我们还是必须考虑对于不同
点格式 LCD 之间的转换操作。所以在 GDI 的驱动程序中涉及到区域操作(Blit):我们在显
示缓冲区上做的最多的操作就是区块搬运。由此,很多的应用处理器使用了硬件图形加速
器来完成区域搬运:blit.从我们的主要操作的对象来看,可以分为两个方向:
内存区域到屏幕区域
屏幕区域到屏幕区域
屏幕区域到内存区域
内存区域到内存区域
在这里我们需要特别提出的是,由于在 Linux 不同进程之间的内存不能自由的访问,
使得我们的每个 Android 应用对于内存区域和屏幕缓冲区的使用变得很复杂。在 Android 的
设计中, 在屏幕缓冲区和显示内存缓冲区的管理分类很多的层次,最上层的对象是可以在
进程间自由传递,但是对于缓冲区内容则使用共享内存的机制。基于以上的基础知识,我
们可以知道:
剩余22页未读,继续阅读
资源评论
- thekingss2018-10-12不错, 框架很清晰
- la2002010202014-01-14原来是论文,稍微了解一下吧。
伊娃码力
- 粉丝: 52
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功