图形操作可以有两种方式实现:一是利用通用CPU模拟图形操作;二是利用GPU专门做图形操作。前者会增加CPU的负担,在现在高分辨率已经是普遍现象的时候,让通用处理器来完成大量的图形计算已经不现实。Android图形系统的发展过程也验证了这一观点。

为了达到高效的图形处理效果,是必须紧密结合软件和硬件的。这篇文章主要介绍跟Android的图形子系统。以后可能会对这些主题进行更加深入的探讨。

Android图形系统的软件构成

下面的示意图,展示了Android上负责图形处理的软件模块。

一个典型Android应用中各个图形系统组件的关

GPU:

GPU专门设计用于加速图形操作。GPU不同于CPU,它的一个设计目的就是高度的并行化,并行化是大部分图形计算的共同特征。

Android刚刚问世的时候,GPU还是可选的,最近发布的版本中,GPU已经是一个必配硬件。如果系统中没有GPU,系统使用的OpenGL ES就包含了libagl和pixelflinger,通过软件实现OpenGL ES协议接口,有时也有硬件支持的CopyBit。但是不幸的是,Android通过软件模拟OpenGL,并不支持OpenGL ES 2.0。现在,Android系统中的不少组件使用了OpenGL ES 2.0,比如HWUI、Renderscript、SurfaceTexture。平板电脑都有很高的分辨率,纯软件的模拟支持并不能保证图形的填充需求,也就不能为用户提供流畅的UI体验。厂商如果想制造基于ICS或者更高版本Android系统的设备,就必须具有支持OpenGL
ES 2.0 的GPU。

Canvas:

画布是应用程序用来绘制Widget或图形等元素的地方。Froyo和Gingerbread上,画布通过Skia来绘制。Honeycomb及以后的版本,HWUI被加入了进来,提供了GPU加速支持。在Ice Cream Sandwich及以后的版本上,HWUI缺省用于图形的绘制。

Skia:

Skia是一组2D绘图的API,它完全通过软件实现。由于性能方面的原因,Skia逐渐被HWUI所替代。

HWUI

HWUI可以使UI组件使用GPU加速。HWUI是在Honeycomb中引入进来的,目的是使交互更加快速,及时响应,流畅。在大分辨率的平板电脑上,通过Skia来绘制动画,会占用很高的CPU资源,进而拖慢整个系统。HWUI需要支持OpenGL ES 2.0的GPU,不能通过软件模拟。

Renderscript

Renderscript同样也是Honeycomb引入的新的API,它的设计为了同时解决移植和性能问题。应用程序员用Renderscript(基于C99)编写代码,然后一个LLVM的交叉编译器把它编译为机器独立的bit code,应用程序员再将其打包到apk中。当用户下载apk时,设备上的编译器(基于LLVM,位于/system/lib/libbcc.so)将bit code编译为目标机器上的指令。

Renderscript在Froyo和Gingerbread上也存在,但是不是公开的API。只有Android的一些wallpaper使用了它。那时它的实现也非常粗糙,功能有限。

Surface:

一个Surface对应一个屏幕外缓冲区,应用程序用来渲染窗口内容。一个游戏程序,它可能使用OpenGL在Surface上绘制3D对象,一个普通应用程序,它可能使用Skia来绘制Widget或者文本,它也可能使用HWUI库来启用GPU加速。从ICS开始,Surface通过一个后端的SurfaceTexture实现,这就意味着Surface对应的不再是一个缓冲区,而是一个纹理(texture)。

Android平台的图形栈

SurfaceFlinger:

SurfaceFlinger是一个合成器,它管理来自于不同应用的Surface。比如,可能有许多应用同时存在,与此对应的,存在许多独立的Surface需要被渲染。SurfaceFlinger决定屏幕上显示的内容,那些需要被覆盖,进行裁剪。

SurfaceFlinger使用的是OpenGL ES 1.1标准中的函数。为什么呢?如果使用OpenGL ES 2.0,就必须需要支持OpenGL ES 2.0的硬件GPU,这会使系统的启动更加复杂,也会使模拟器的实现更加困难。

HW Composer:

硬件合成器是Honeycomb引入的一个HAL,SurfaceFlinger使用它,利用硬件资源来加速Surface的合成,比如3D GPU和2D的图形引擎。

CopyBit:

CopyBit也是一个HAL。它允许使用特殊硬件来加速一些图形操作,比如复制(blitting)。它设计的初衷是在没有3D GPU的系统上加速软件的渲染过程。CopyBit在ICS中被删除了,因为GPU已经成为一个必备硬件,没有必要专门设计一个加速部件。

Libagl/PixelFlinger:

libagl是一个通过软件实现了OpenGL ES 1.0和1.1版本API的组件。它使用PixelFlinger来实现OpenGL调用。为了加速使用PixelFlinger的渲染过程,JIT被引入了进来,称为CodeFling。CodeFling生成机器代码,它急剧加速了许多类型的像素操作。

可以看出,Android的图形系统在不断的调整,目的是为了提供更加快速流畅的UI体验。这就是Android版本中图形相关代码变动很大的原因。

原文参考:http://developer.mips.com/2012/04/11/learning-about-android-graphics-subsystem/

Android图形子系统的更多相关文章

  1. Android图形基础

    Android图形基础 Android在其android.graphics包中提供了完整的本机二维图像库. Color类,代表颜色,是用4个数字表示的,透明度.红色.绿色和蓝色(Alpha.Red.G ...

  2. Android Camera子系统之源码View

    本文基于Android 4.2.2+Linux3.6.9+SAMA5D3 SoC从源码的角度审视Android Camera子系统. 应用层 Androd原生Camera应用 /system/app/ ...

  3. Linux/Android——input子系统核心 (三)【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/42123673 之前的博客有涉及到linux的input子系统,这里学习记录一下input模块. ...

  4. Android Camera子系统之Linux C应用开发人员View

    Android Camera HAL通过V4L2接口与内核Camera Driver交互.本文从Linux应用开发人员的角度审视Android Camera子系统. V4L2应用开发一般流程: 1. ...

  5. Android Framework------之Input子系统

    下面这是基于Android4.2代码的关于Input子系统的笔记.在这篇笔记中,只涉及Android相关的东西,关于Linux内核中对各种输入设备的统一,在本文中不作说明.此外,由于才疏学浅,文中难免 ...

  6. android图形基础知识

    Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...

  7. Android图形合成和显示系统---基于高通MSM8k MDP4平台

    介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...

  8. android 图形图像

    Canvas 画布 paint 画笔 Path 路径Path代表任意多条直线连接而成的任意图形,当Canvas根据Path绘制时,它可以绘制出任意的形状 使用 Matrix 控制图像或组件变换步骤:① ...

  9. 【Android】Android输入子系统

    成鹏致远 | lcw.cnblogs.com | 2013-10-25 Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linux输入子系统设备是基于平台 ...

随机推荐

  1. GYM100741 A Queries

    A. Queries time limit per test 0.25 s memory limit per test 64 MB input standard input output standa ...

  2. javaScript中的事件对象event是怎样

    事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...

  3. 【django后端分离】Django Rest Framework之认证系统之redis数据库的token认证(token过期时间)

    1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_res ...

  4. java 2类与对象[学堂在线]

    java的面向对象方法和特征(略) 累的声明格式 语法:先定义一个引用变量名 穿件对象 new aclock=new CLock() 没有ststaic 就是实例变量 类变量static 类变量 方法 ...

  5. 【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring

    [链接]h在这里写链接 [题意] 给你n个数字; 让你在其中找出三个数字i,j,k(i<=j<=k); 使得p*a[i]+q*a[j]+r*a[k]最大; [题解] /*     有一个要 ...

  6. 廖雪峰Python总结4

    面向对象编程 将计算机程序视为一系列的命令集合.包含: 数据 操作数据的函数 Python中,所有的数据类型都可以视为对象. 面向对象特点:封装,继承,多态. 类的函数和普通函数:类的第一个参数永远是 ...

  7. orm1.0

    class Field: def __init__(self,name,column_type,primary_key,defaule): self.name = name self.column_t ...

  8. jQuery打飞机游戏

    在线演示 本地下载

  9. iOS 获取 APP 的 Launch Image

    http://www.cocoachina.com/ios/20151027/13780.html 作者:里脊串 授权本站转载. 启动图(LaunchImage)的管理其实在iOS开始中算比较简单的了 ...

  10. 【风马一族_mysql】mysql基本指令

    船停在港湾是很安全的,但那不是造船的目的! 用户 创建用户 mysql>grant 权限(select,insert,update,delete) on  数据库.数据表  to  用户名@电脑 ...