没有合适的资源?快使用搜索试试~ 我知道了~
首页Android_GDI基本框架.doc
Android_GDI基本框架.doc

Android GDI基本框架 Android的GDI系统 Android GDI之屏幕设备管理-动态链接库 Androird GDI之共享缓冲区机制 Android GDI之SurfaceFlinger Surface&Canvas
资源详情
资源评论
资源推荐

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 之屏幕设备管理-动态链接库
万丈高楼从地起,从最根源的硬件帧缓冲区开始。我们知道显示 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.从我们的主要操作的对象来看,可以分为两
个方向:
1)内存区域到屏幕区域
2)屏幕区域到屏幕区域
3)屏幕区域到内存区域
4)内存区域到内存区域
在这里我们需要特别提出的是,由于在 Linux 不同进程之间的内存不能自由的访问,使得
我们的每个 Android 应用对于内存区域和屏幕缓冲区的使用变得很复杂。在 Android 的设计
中,在屏幕缓冲区和显示内存缓冲区的管理分类很多的层次,最上层的对象是可以在进程
间自由传递,但是对于缓冲区内容则使用共享内存的机制。

基于以上的基础知识,我们可以知道:
(1)代码中 Config 及其 Format 的意义所在了。也就理解了兼容性的意义:采用同硬件相
同的点的描述对象
(2)所有屏幕上图形的移动都是显示缓冲区搬运的结果。
1.2 图形加速器
应用处理器都可能带有图形加速器,对于不同的应用处理器对其图形加速器可能有不同
的处理方式,对于 2D 加速来讲,都可归结为 Blit。多为数据的搬运,放大缩小,旋转等。
2 Android 的缓冲区抽象定义
不同的硬件有不同的硬件图形加速设备和缓冲内存实现方法。Android Gralloc 动态库抽
象的任务就是消除不同的设备之间的差别,在上层看来都是同样的方法和对象。在 Moudle
层隐藏缓冲区操作细节。Android 使用了动态链接库 gralloc.xxx.so,来完成底层细节的封装。
2.1 本地定义@hardware\libhandware\modules\gralloc
每个动态链接库都是用相同名称的调用接口:
1)硬件图形加速器的抽象:BlitEngine,CopyBit 的加速操作。
2)硬件 FrameBuffer 内存管理
3)共享缓存管理
从 数据关系 上我 们 来 考察 .. 动 态 链 接 库 的 抽象 行 为 : 在 层 次 : Hardware.c@hardware\
libhardware 中对动态链接库中的内容作了全新的包装。/system/lib/hw/gralloc.xxx.so 动态库
文 件 。 从 文 件 Gralloc.h(handware\libhardware\include\hardware) 是 抽 象 的 结 果 :
hw_get_module 从 gralloc.xxx.so 提取了 HAL_MODULE_INFO_SYM(SYM 变量)
剩余23页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论2