原址

这篇文章中,我们会展示android Graphic 的架构.

  1. Androidframework

我们知道Android framework 提供了两大类graphicrender API.一是用Canvas 类也称2D renderer另外一种是直接用OpenGL 接口, 通常称为3D renderer path app. 下图是用2Drenderer path 的 Graphic stack.

通常这里有两种底层库来支撑2D renderer path app.

  • Skia(Libskia.so).Android SW render engine.

  • HWUI(libhwui.so)HWUI 是把Canvas 的drawing 操作转换为OpenGL 的操作(OpenGLRenderer).这样就可以用GPU来加速Canvas 的drawing.

  • 现在在HUWI 是默认enable的.

    其通常的调用流程如下:

    下图是3D renderer path 的Androidapp stack.

Activiy 能直接创建GLSurfaceView并通过调用OpenGL ES 接口android.opengl.*把view 画到surface 上.一般来说其底层库可以是SW 的实现也可以是HW 的实现.当前Android 原生的code 就有SW的实现pixelflinger(只实现了OpenGL ES 1.0 ),Google 要求所有的芯片厂商需要有OpenGL 的HW 实现.其流程简单如下:

2. Android Graphic component

主要有以下compoent:

  • Surface

    在android graphic 系统中,所有的内容都画在”surface”上.对android graphic 系统我们可以看作生产者/消费者模型.对生成者来说,就是产生图像如button,image,video frame 等.而图像的消费者往往是android graphic 的另一个重要compoent --surfaceflinger.我们每创建一个window,就创建了一个surface.

  • Surfaceflinger

    Surfaceflinger是一个系统后台服务程序,其主要作用是把所有可见的surface合成到LCD 上.

  • Image Stream Producers

    图像的生成者.如Canvas, OpenGL ES 和video player 等.

  • Image Stream Consumers

    图像的消费者.最主要的消费者是surfaceflinger. OpenGL ES APP 也有可能成为图像的消费者,如camera app 的preview 就是camera sensor 图像输出的消费者.一些非GL 的应用也可能成为图像的消费者,如imageReader 等.

  • Window Manager

    Androd的后台servcie,驻留在system server 中.其主要管理android中的window. window 是view的容器并且和surface相关联.一个window 对应一个surface.除此之外,window manager 还管理input 事件的分发,焦点事件的管理,window的z-order,位置,animation等.Window manager 把window的meta 信息发送给surfaceflinger.Surfacefinger 根据这些meta 信息把所有可见的window 合成到LCD 上并显示.

  • Gralloc

    Graphic的memroy的分配和管理.

  • Hardware Composer

    其主要完成surface的合成.在andorid 系统中,有两种合成方式.一种是HW,另一种是GPU. HW的合成是比较昂贵的操作, 所以在大多硬件平台上只支持四个layer (surface) 的合成.超过四个layer就需要GPU加入.

    另外,Hardware composer 另外一个重要的工作是必须支持VSYNC 事件,HDMI 的hotplug plug-and-play事件.

3. Data flow

下图是典型的android 的graphic的pipeline.

我们知道在androidapp 中通常有4个layer.Navigator bar,System UI, background, app views.在上图中,有一个layer 是由CPU 合成,有3个layer 是由HW composer 合成.

Buffer Queue 在android graphic 中占有重要的地位. 它有一个buffer pool通常只用3个buffer(在app看来这个buffer queue 就是surface.在surfaceflinger看来就是layer).它通过IPCbinder 把图像的生产者和消费者联系了起来.当生产者(app)画好图片后,会通知消费者(Surfaceflinger).消费者(surfaceflinger)会在一定的时间把画好的图片经HWcomposer 或GPU合成后显示在LCD上.BufferQueue有三种工作模式.

  • 阻塞模式

    这是buffer queue的默认工作模式.生产者产生一个frame,消费者用掉一个frame.没有frame被丢失.其缺点是如果生产者画得太快,或者说需要的buffer过多,而其消费者处理太慢,当buffer 的数量(默认最多32个buffer)不够用时,生产者会等待.

  • 非阻塞模式

    Buffer queue 可以工作在非阻塞模式.如果出现消费不能dequeue buffer 时, 直接返回一个错误而不是等待到一个可用的buffer为止.这样做的好处是可以避免app死锁或者(ANR问题).

  • Discard mode

    BufferQueue 可以工作在discard mode.在这种模式下, 当buffer 不够时, 老的buffer会被discard.

其流程如下:

  • 当生产者需要画图像时,首先需要向window(surface) 申请dequeuer 一个buffer.

  • 生产者画好图像后,把buffer 返回到buffer queue中,并通知消费者已经有一个图像可以使用.

  • 在适当的时候(Vsync-sf),消费者从buffer queue 中获取可用的buffer(已经画好图像),并且处理该图像(合成并显示到LCD)

  • 消费这对图像处理完毕,然后把buffer release 到bufferqueue 中.

Android Graphic 架构相关推荐

  1. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  2. Android Jetpack架构组件之 Room(使用、源码篇)

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...

  3. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  4. Android系统架构图及简单的系统架构介绍

    2019独角兽企业重金招聘Python工程师标准>>> ndroid的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层. ...

  5. android mvvm livedata_再谈Android应用架构——Jetpack VS 生命周期

    前面我们对MVC.MVP.MVVM进行了详尽的分析,但还有一个问题悬而未决,那就是生命周期.在Android平台上生命周期具有十分重要的意义,因此这也是架构必须考虑的因素之一.生命周期处理不好很容易发 ...

  6. Android系统架构基本模式解析

    Android系统架构总共被分为四层,在这里大家就可以通过介绍对这四个层次进行一个深入的解读,以加深大家对这一系统的认识. 如今,大家面对市场中种类繁多的手机必然挑的眼花缭乱.不过,在智能手机占据主要 ...

  7. android phone驱动_一文带你掌握 Android 系统架构

    引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制.虽然Android系统非常 ...

  8. Android Treble架构解析

    本文主要介绍Treble架构下的HAL&HIDL&Binder相关技术原理.Treble的详细资料文档,请参考Treble 官方文档. 1. Treble 简介 Android 8.0 ...

  9. Android MediaRecorder架构详解

    1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord.两者的区别如下: (1) MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后 ...

最新文章

  1. C语言实现将彩色bmp图像转化为灰图、灰度图像反色
  2. Multithread 之 introduction
  3. 微服务架构的四大金刚利器
  4. log file sycn 概述
  5. Android学习笔记--动画特效
  6. RSA公钥格式PKCS#1,PKCS#8互转(微信获取RSA加密公钥)
  7. 2020年6月学术会议变动汇总
  8. 获取表数据_mysql数据库部分表被truncate,部分数据被delete的解决过程
  9. Intel Media SDK H264 encoder GOP setting
  10. python中装饰器修复技术_python3之装饰器修复技术@wraps
  11. 多线程的那点儿事(之优先级反转)
  12. SAP License:由师姐的包包所想到如何能够掌握客户的需求
  13. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
  14. Office 2003卸载不掉,可以使用官方的删除工具
  15. Vue项目 设置实时时间(年月日 时分秒)两种方法
  16. 针对QQ邮箱发邮件限制的解决方案
  17. CDMA 短信中心号码
  18. 【前端工程化】搭建vue-cli + cesium项目的脚手架及常见问题
  19. vue_drf之视频接口
  20. MAF-YOLO: Multi-modal attention fusion based YOLO forpedestrian detection

热门文章

  1. SQLite第九课 sqlite3_set_authorizer案例
  2. 查询某字段不重复记录的SQL语句
  3. 两台Windows7的笔记本,充分利用自带无线网卡共享上网。
  4. 2017 年,阿里巴巴开源的那些事儿
  5. Twproject Gantt – 开源的 JavaScript 甘特图组件
  6. cmake使用教程(五)调用opencv外部库和自己生成的库
  7. 数据库设计三范式的举例及四大特性说明
  8. html tab键自动填充,HTML tabindex — TAB按键操作
  9. javacore分析工具_线上死锁定位分析
  10. java形参、实参、值传递、引用传递