文章目录

  • 一、从 图形 选渲/合成/送显 角度看android图形
  • 1、绘制---通过2D/3D绘制API在surface上渲染出内容
  • 2、合成---把需要在屏幕上显示出来的全部surface图层进行合并
  • 3、送显---把合并后的显存送到显示驱动显示到屏幕上
  • 二、从功能角色的角度看android图形
  • 1、图形内容决定:应用APP创建Surface画布(图元单元),决定内容是什么
  • 2、图形系统服务:SurfaceFlinger服务(硬件统筹),决定哪些内容什么时候显示
  • 3、图形显存buf提供者:(HAL) Gralloc模块,提供显存
  • 4、多层叠加设备:(HAL)HWCompose模块,用于显示层叠加(软/硬)
  • 5、底层显示设备:(kernel)FrameBuffer驱动,用于叠加后的图形显示
  • 三、从数据流(buffer轮转消耗)看android图形
  • BufferQueue基础buffer轮转模型
  • 相关推荐


一、从 图形 选渲/合成/送显 角度看android图形

任何一个图形显示系统,从原理上讲都可以从 渲染(也就是绘制 内容)合成(把多个绘制的结果 并和)送显(把合并的结果用设备显示出去) 分解。android图形系统也是如此。

android XY图形 android图形系统_android

1、绘制—通过2D/3D绘制API在surface上渲染出内容

在绘制一个android应用程序窗口的UI之前,首先要确定里面的各个子UI元素在父UI元素里面的大小和位置。确定各个子UI元素在父UI元素里面的大小以及位置的过程有称为测量过程和布局过程。因此,android应用程序窗口的UI渲染过程可以分为测量(确定所有视图的大小)布局(确定所有视图的位置)绘制(在画布canvas绘制应用程序窗口的所有视图) 三个阶段。
android绘图的API很多,比如2D的绘图skia;3D的绘图OpenGL,Vulkan等,绘制到surface上。Canvas API 进行绘制最终都会调用到外部链接库的 Skia 和 OpenGL,应用的每个 Window 会关联一个 Surface,Surface会关联真正的Graphic Buffer缓冲队列(如三缓冲机制)。

2、合成—把需要在屏幕上显示出来的全部surface图层进行合并

android的合成是基于surfaceFlinger系统服务,会管理全部surface,按Vsync(基于显示屏刷新事件)判断是否有层需要更新,送到hwcomposer进行叠加合成(如果有硬件叠加器并且支持能力选择 硬件叠加器,否则用GPU叠加)。

android XY图形 android图形系统_android XY图形_02

3、送显—把合并后的显存送到显示驱动显示到屏幕上

android叠加后的送显一般通过hwc叠加后完成,送给图形linux驱动fb或者overlay传递硬件独立的视频通路;

二、从功能角色的角度看android图形

用一个很粗糙的框图体现显示系统整体流程,从功能角色的角度看android图形:

每个APP自己包含需要显示的Surface,APP决定自己surface布局,内容,用什么方式进行绘制;SurfaceFlinger是图形系统服务,管理全部surface,决定每个surface在什么点刷新内容(Vsync),并把在时间轴上需要显示出来的surface收集,送给HWC硬件叠加设备进行叠加,叠加输出到 待显示的显存上(通过Gralloc提供的ion内存),然后HWC把显存再送给FrameBuffer图形显示驱动,最终画面显示出来。

android XY图形 android图形系统_UI_03

1、图形内容决定:应用APP创建Surface画布(图元单元),决定内容是什么

在每一个应用中都以Surface作为一个图元传递单元,向SurfaceFlinger这个服务端传递图元数据。
不论是使用Skia(2D向量图形处理函数库)绘制二维图像,还是用OpenGL(Open Graphics Library是用于渲染2D、3D矢量图形的跨语言、跨平台的API)绘制三维图像,最终Application都要和Surface交互。Surface就像是UI的画布,而App则像是在Surface上作画。
APP在创建Activity的时候,会出现 View和Window两个概念。其中Window是一个抽象基类,用于控制顶层窗口的外观和行为
,如绘制背景和标题栏、默认的按键处理等。View是一个基本的UI单元可用于绘制,并能处理事件,View最终和Surface进行关联,在AddView过程内部最终会包含一个surface成员

2、图形系统服务:SurfaceFlinger服务(硬件统筹),决定哪些内容什么时候显示

SurfaceFlinger是android的一个系统服务,其负责管理应用端的surface,将所有的surface复合。
这个系统服务主要实现了Surface的建立、控制、管理等功能。他是介于图形库和应用之间的一层。每个应用在它自己的surface完成各种图形操作后,请求SurfaceFlinger显示到屏幕,surfaceflinger就会将所有的surface叠加起来,通过HWComposer,并且送到到framebuffer进行显示。

3、图形显存buf提供者:(HAL) Gralloc模块,提供显存

Android中各子系统通常不会直接基于Linux驱动来实现,而是由HAL层间接引用底层架构,在显示系统中也同样如此,它借助于HAL层来操作帧缓冲区,而完成这一中介任务的就是Gralloc。
用户空间的应用程序在使用帧缓冲区之前,首先要加载Gralloc模块,然后打开帧缓冲设备,获取设备的各种参数并完成 gralloc 模块的初始化。有了gralloc设备之后,用户空间中的应用程序就可以申请分配一块图形缓冲区,并且将这块图形缓冲区映射到应用程序的地址空间来,以便可以向里面写入要绘制的画面的内容。

4、多层叠加设备:(HAL)HWCompose模块,用于显示层叠加(软/硬)

为了解放GPU的绘制能力,很多芯片厂家会提供硬件叠加合成,如果硬件叠加器支持的场景都可以走硬件叠加,解放GPU的绘制能力,GPU就专心的做layer的绘制工作,提升的渲染的性能。
应用把要显示的layers交给SurfaceFlinger,SurfaceFlinger直接把这些layers交给hwc,hwc就可以在自己能力范围内做好合成,再把合成好的结果拿去显示。如果芯片显示硬件模块功能较弱,不支持某些合成场景,就会用CPU(纯软件合成)或者GPU去做。

5、底层显示设备:(kernel)FrameBuffer驱动,用于叠加后的图形显示

FrameBuffer是linux提供的显存驱动,在android环境设备节点是/dev/graphics/fb*(支持多个屏幕显示,第一个fb0是主显示屏幕)。FrameBuffer的目的就是通过对硬件的封装抽象,让上层通过设备节点文件的方式,操作硬件去显示某个内存的内容。

android XY图形 android图形系统_UI_04

三、从数据流(buffer轮转消耗)看android图形

android XY图形 android图形系统_android XY图形_05


左侧的对象是生成图形缓冲区(每个缓冲区对应了一个surface)的渲染器,如主屏幕、状态栏和系统界面。SurfaceFlinger 是整个内容管理的合成器,消耗了此刻的surface内容,通过硬件混合渲染器HWC叠加显示出去。

BufferQueue基础buffer轮转模型

BufferQueues 是 Android 图形组件之间的粘合剂。它们是一对队列,可以管理buffer从生产方到消耗方的固定周期。

android XY图形 android图形系统_android_06