Android显示系统学习回顾

看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 会执行以下计算:

  1. SurfaceFlinger HWC 提供一个完整的层列表,并询问您希望如何处理这些层?
  2. HWC 的响应方式是将每个层标记为设备或客户端合成。
  3. SurfaceFlinger 会处理所有客户端,将输出缓冲区传送到 HWC,并让 HWC 处理其余部分。

一些比较好的资料:

Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)

Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)_jxt1234and2010的专栏-CSDN博客

还有一位大牛的分享

https://windrunnerlihuan.com/page/2/

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值