看Android的显示系统相关资料有一段时间了,内容很多,很杂,一直没有贯穿起来。很多资料写的比较难懂。太多的概念,太多的浮云,正所谓“总为浮云能蔽日,长安不见使人愁”。
再看到开发者网站的简介时,似乎有所顿悟,
图形 | Android 开源项目 | Android Open Source Project
曾经通过获取surfaceFlinger中保存的各应用的GraphicBuffer来保存为图片,理解了GraphicBuffer的传送和使用,GraphicBuffer贯穿了上图的显示过程,status bar这些应用通过GPU渲染(使用OpenGL)把画面写到GraphicBuffer中,就是上图的蓝色方块BUFFER QUEUE(buffer queue是对GraphicBuffer使用的封装),然后,SurfaceFlinger中进行画面的合成,这个时候可以使用GPU合成(client),也可以使用HWC合成(device),具体的信息可以看HWC合成。
这样,初步的流程就打通了。然后就可以去看各处理细节。
之前有个疑问:SurfaceFlinger中已经有了各应用(layer)的GraphicBuffer画面,直接叠加计算得到新的内存数据不就行了么,为什么要搞那么复杂?
悟的太迟:叠加计算各坐标的像素值是CPU操作,这个处理太慢。所以就需要GPU和HWC方式。
以下HWC合成的介绍内容来自android官网资料 硬件混合渲染器 HAL | Android 开源项目 | Android Open Source Project
当您考虑使用叠加平面时,很容易发现这种方法的好处,它会在显示硬件(而不是 GPU)中合成多个缓冲区。例如,假设有一部普通 Android 手机,其屏幕方向为纵向,状态栏在顶部,导航栏在底部,其他区域显示应用内容。每个层的内容都在单独的缓冲区中。您可以使用以下任一方法处理合成:
- 将应用内容渲染到暂存缓冲区中,然后在其上渲染状态栏,再在其上渲染导航栏,最后将暂存缓冲区传送到显示硬件。
- 将三个缓冲区全部传送到显示硬件,并指示它从不同的缓冲区读取屏幕不同部分的数据。
后一种方法可以显著提高效率。
显示处理器功能差异很大。叠加层的数量(无论层是否可以旋转或混合)以及对定位和重叠的限制很难通过 API 表达。为了适应这些选项,HWC 会执行以下计算:
- SurfaceFlinger 向 HWC 提供一个完整的层列表,并询问“您希望如何处理这些层?”
- HWC 的响应方式是将每个层标记为设备或客户端合成。
- SurfaceFlinger 会处理所有客户端,将输出缓冲区传送到 HWC,并让 HWC 处理其余部分。
一些比较好的资料:
Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)
Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)_jxt1234and2010的专栏-CSDN博客
还有一位大牛的分享
https://windrunnerlihuan.com/page/2/