简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION关系
2.HWC
HWC(hwcomposer)是Android中进行窗口(Layer)合成和显示的HAL层模块,特定的硬件设备,而且通常由显示设备制造商 (OEM)完成,为SurfaceFlinger服务提供硬件支持。
HWC合成机制
1.SurfaceFlinger给HWC提供layer list,询问如何处理这些layer;
2.HWC将每个layer标记为overlay或者GLES composition,然后回馈给SurfaceFlinger;
3.SurfaceFlinger需要去处理那些GLES的合成,而不用去管overlay的合成,最后将overlay的layer和GLES合成后的buffer发送给HWC处理。
SurfaceFlinger可以使用OpenGL ES合成Layer,这需要占用并消耗GPU资源。
大多数GPU都没有针对图层合成进行优化,当SurfaceFlinger通过GPU合成图层时,应用程序无法使用GPU进行自己的渲染。
而HWC通过硬件设备进行图层合成,可以减轻GPU的合成压力。
3.GPU
区别于HWC硬件,当没有GPU的设备,可以使用HWC或CPU渲染。
4.OpenGL ES
OpenGL ES是一套绘制3D图形的API,OpenGL ES是和平台无关的一套API ,主要是为了rendering 2D 和 3D图形等。一般这套接口是用来和GPU进行交互的,使用GPU进行rendering 硬件加速。 说白了OpenGL就是一组函数名,并不能直接用,需要底层硬件GPU的支持。
OpenGL ES的实现方式有2种:
第一种:是软件实现,用cpu去绘图,就是的agl(libGLES_android.so), 路径frameworks\native\opengl\libagl,即the software OpenGL ES library.
第二种:是硬件厂商根据自己GPU提供的实现,一般都不开放源代码,就是/vendor/lib/egl或/system/lib/egl目录下的库。
5.EGL
EGL库的作用就是将OpenGL ES和本地窗口系统结合起来。
如果要画个纹理三角形,调用OpenGL ES接口,如果要把图形渲染(显示)到屏幕,需要调用EGL接口。
使用OpenGL ES前,先需要调用EGL的相关函数设置好OpenGL ES的本地环境,一般EGL和OpenGL ES使用时都会先利用egl函数(egl开头)创建opengl本地环境,然后再利用opengl函数(gl开头)去画图!
6.NativeWindow和OpenGL调用关系
7.Surface
本地窗口为Surface,继承自ANativeWindow。
8.Gralloc核心功能作为framebuffer的封转,向/dev/fb0写数据,显示在屏幕上。
gralloc分配framebuffer图形缓冲区
gralloc分配图形缓冲区,又分为framebuffer图形缓冲区(GPU操作:/dev/graphics/fb)和普通图形缓冲区(CPU操作:/dev/fb)两种。
gralloc调用gralloc_alloc_framebuffer()分配framebuffer的内存,
其核心是对fb设备/dev/graphics/fb或者/dev/fb执行mmap(),映射到用户空间,然后去操作。这样用户空间就可以共享数据给GPU显存和CPU的内存了,就可以直接操作。
android中,HAL层的gralloc库负责了申请图形缓冲区的所有工作,HAL层之上的Surface、BufferQueue最终都是调用gralloc库去申请图形缓冲区。
9.Vsync 垂直同步信号
HWC利用硬件或者软件产生的持续Vsync信号,去触发SurfaceFlinger和UI去做绘图相关的工作,让绘图工作充分利用每个Vsync信号间隔的时间;
Triple Buffering,SurfaceFlinger有三缓冲会将Jank几率降到最小。
10.Fence
Fence是一个同步机制,它是OpenGL ES 3.0的一个特性,在GPU和CPU之间协调工作,fence让GPU和CPU并行运行,提高了图像显示的速度。
CPU和GPU两个硬件是异步的,当使用opengl时,首先在CPU上调用一系列gl命令,然后这些命令去GPU执行真正的绘图过程,绘图何时结束,CPU根本不知道,当然可以让CPU阻塞等待GPU绘图完成,然后再去处理后续工作,但是这样效率就太低。于是Fence机制便产生了。
11.显示相关
DisplayManager:管理附加显示器的属性。
LogicalDisplay:描述如何配置逻辑显示。
DisplayInfo:描述特定逻辑显示的特性。
DisplayAdapter:显示适配器使系统可以使用零个或多个显示设备,并提供发现何时连接或断开显示的工具。目前,所有显示适配器都在系统服务器中注册,但原则上可以从其他进程中完成。