Android Graphic 架构
原址
这篇文章中,我们会展示android Graphic 的架构.
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 架构相关推荐
- [Android] Android MVP 架构下 最简单的 代码实现
Android MVP 架构下 最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...
- Android Jetpack架构组件之 Room(使用、源码篇)
2019独角兽企业重金招聘Python工程师标准>>> 1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发 ...
- Android系统架构-[Android取经之路]
摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...
- Android系统架构图及简单的系统架构介绍
2019独角兽企业重金招聘Python工程师标准>>> ndroid的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层. ...
- android mvvm livedata_再谈Android应用架构——Jetpack VS 生命周期
前面我们对MVC.MVP.MVVM进行了详尽的分析,但还有一个问题悬而未决,那就是生命周期.在Android平台上生命周期具有十分重要的意义,因此这也是架构必须考虑的因素之一.生命周期处理不好很容易发 ...
- Android系统架构基本模式解析
Android系统架构总共被分为四层,在这里大家就可以通过介绍对这四个层次进行一个深入的解读,以加深大家对这一系统的认识. 如今,大家面对市场中种类繁多的手机必然挑的眼花缭乱.不过,在智能手机占据主要 ...
- android phone驱动_一文带你掌握 Android 系统架构
引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制.虽然Android系统非常 ...
- Android Treble架构解析
本文主要介绍Treble架构下的HAL&HIDL&Binder相关技术原理.Treble的详细资料文档,请参考Treble 官方文档. 1. Treble 简介 Android 8.0 ...
- Android MediaRecorder架构详解
1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord.两者的区别如下: (1) MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后 ...
最新文章
- C语言实现将彩色bmp图像转化为灰图、灰度图像反色
- Multithread 之 introduction
- 微服务架构的四大金刚利器
- log file sycn 概述
- Android学习笔记--动画特效
- RSA公钥格式PKCS#1,PKCS#8互转(微信获取RSA加密公钥)
- 2020年6月学术会议变动汇总
- 获取表数据_mysql数据库部分表被truncate,部分数据被delete的解决过程
- Intel Media SDK H264 encoder GOP setting
- python中装饰器修复技术_python3之装饰器修复技术@wraps
- 多线程的那点儿事(之优先级反转)
- SAP License:由师姐的包包所想到如何能够掌握客户的需求
- 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
- Office 2003卸载不掉,可以使用官方的删除工具
- Vue项目 设置实时时间(年月日 时分秒)两种方法
- 针对QQ邮箱发邮件限制的解决方案
- CDMA 短信中心号码
- 【前端工程化】搭建vue-cli + cesium项目的脚手架及常见问题
- vue_drf之视频接口
- MAF-YOLO: Multi-modal attention fusion based YOLO forpedestrian detection