做淘宝美工的网站,公司平台,免费的网站推广 外贸,网站优化排名易下拉教程目录 引言
概念与理解
SurfaceFlinger
Surface
HWC
Fence#xff1a;
Gralloc#xff1a;
DisplayDevice 引言
Activity是Android的主要UI相关组件。通过View的相关类和接口实现#xff0c;在WMS的管理下#xff0c;进行窗口和控件的测量#xff0c;布局和绘制
Gralloc
DisplayDevice 引言
Activity是Android的主要UI相关组件。通过View的相关类和接口实现在WMS的管理下进行窗口和控件的测量布局和绘制形成的图层交给SurfaceFlinger进行合成渲染然后提供给屏幕进行显示
概念与理解
SurfaceFlinger
是Android图形的大总管负责管理图形的合成与渲染。
SurfaceFlinger会依赖多个线程来实现完成其合成渲染的功能。这些线程也是实现Vsync机制的框架的线程。换句话说SurfaceFlinger主要是依赖于Vsync机制来实现流水线的方式管理Android图形的合成与渲染。首先Vsync可以是由硬件产生也可以由软件来产生硬件产生Vsync的实体叫做HWComposer软件的产生Vsync的实体叫做VsyncThread。在SurfaceFlinger启动main函数初始化阶段还会创建一个DispVsyncThread用于将Vsync信号一分为二分别提供给SF和APP。产生这两个vsync信号的叫做EventThread-sf和EventThread-app
Surface
可以理解为一个canvas的画布可以利用skia库进行绘制。一个窗口就对应一个Surface
Android显示的基本流程是
1创建一个SurfaceFlinger的客户端SurfaceComposerClient通过这个客户端创建一个Surface同时获取一个SurfaceControl
2SurfaceControl设置Layer层数Surface获取buffer
3锁定Buffer并写入buffer
4提交buffer由屏幕进行刷新显示
HWC
HWChwcomposer是Android系统进行窗口合成显示的HAL层模块通常是由显示设备制造商OEM实现并完成为SurfaceFlinger服务提供硬件支持
HWC对Layer进行合成属于硬件操作可以减轻GPU合成负担这两种合成方式被称作Device与Client。
HWC的合成流程大概是
1SurfaceFlinger向HWC提供所有Layer的完整列表让HWC根据其硬件能力决定如何处理这些Layer。
2HWC给每个Layer标注合成方式
3SurfaceFlinger负责先把标注成GPU合成的Layer合成到一个输出buffer然后把这个输出buffer和其他Layer一起交给HWC让HWC完成剩余Layer的合成最后提供给屏幕进行显示
官方要求HWC设备必须具备的功能
1至少支持4个叠加层状态来系统栏应用本身和壁纸或者背景
2叠加层可以大于显示屏
3具备每像素和每平面的Alpha混合
4为了支持受保护内容必须提供受保护内容视频播放的硬件路径
5RGBA packing orderYUV formatstilingswizzlingstrict properties
部分专业词汇说明
Tiling可以把Image切割成MxN个小块最后渲染时再将这些小块拼接起来就像铺瓷砖一样。Swizzling一种拌和技术表示向量单元可以被任意地重排或重复
HWComposer是Device合成的抽象
Fence
Fence是一种资源同步机制可以理解为资源锁。主要用于跨硬件场景如CPU,GPU,HWC之间的buffer资源的同步。
实现原理
Gralloc
般来讲Gralloc模块在实际设备中是由硬件厂商提供的以便于最佳地配合手机硬件。实现的目录在hardware/libhardware/modules/gralloc中 Android帧缓冲区硬件抽象层模块Gralloc的实现原理如下 1分配一个匹配屏幕大小的图形缓冲区 2将分配好的图形缓冲区注册映射到当前进程的地址空间来 3将要绘制的画面的内容写入到已经注册好的图形缓冲区中去并且渲染拷贝到系统帧缓冲区中去 为了实现以上三个操作我们还需要 1加载Gralloc模块 2打开Gralloc模块中的gralloc设备和fb设备 其中gralloc设备负责分配图形缓冲区Gralloc模块负责注册图形缓冲区而fb设备负责渲染图形缓冲区。在GrafficBuffer中内存是由Gralloc模块中分配的基于上一节 FB的工作原理这里主要分析Gralloc模块如何分配内存。
DisplayDevice
应用端的Buffer是向Ashmem申请的DisplayDevice端的Buffer是向FrameBuffer申请的 应用端的Buffer是用来填充的DisplayDevice端的Buffer是用来推给Framebuffer 渲染的