硬件合成图像-Android

SurfaceFlinger中图像合成流程- https://blog.csdn.net/u014409795/article/details/51354595
Android P 图形显示系统(一)硬件合成HWC2- https://blog.csdn.net/chaojiangluo/article/details/81475607

所谓3D合成,其实是使用OpenGL标准,用GPU把图层画到统一的FrameBuffer上,然后送显。毫无疑问这是离线合成的一种。既然是按OpenGL标准的,我们来带着如下问题阅读: 
1、OpenGL渲染的FrameBuffer是如何送到LCD的? 
2、为了使用OpenGL绘制图像,必须把该图像内容作为纹理上传到GPU内存,然后使用OpenGL绑定纹理渲染。那么,每个图层是怎么样变成纹理的?glTexImage2D传输上去? 
3、每个图层的绘制区域是如何计算的,图层间存在重叠区域时,如何混合颜色? 
4、使用OpenGL ES的哪套标准(1.1 /2.0 /3.0)?

openCL image2d,openGL Texture2D;

  Android在此新增一个RenderEngine类,用来屏蔽OpenGL ES1.0、1.1和2.0的用法差异。基本用法和opengl是一样的,没有简化太多。 
在创建RenderEngine的时候,会根据GPU所支持的OpenGL ES 版本号,优先选择 2.0,没有2.0可用时使用1.1/1.0。

  适用于硬件实现的宽动态图像合成算法:实时宽动态图像合成方法。算法首先获取同一场景两幅不同曝光量的图片,通过使用线性亮度映射函数,从短曝光图像对应区域的信息恢复出长曝光图像中过曝区域的信息。本算法只需利用两幅原始图像,所需数据量少,且无需恢复图像中的亮度与曝光比信息,计算复杂度很低。同时应用线性函数表示二者关系,更易于硬件实现。
  Hardware Composer HAL (HWC) 是 SurfaceFlinger 用来将 Surface 合成到屏幕。HWC 可以抽象出叠加层和 2D 位块传送器等,其主要是帮忙GPU完成一些工作。
  SurfaceFlinger是一个系统服务,其作用是接受来自多个源的Buffer数据,对它们进行合成,然后发送到显示设备进行显示。在之前的Android版本中,显示基本都是基于硬件的FrameBuffer来实现的,例如/dev/graphics/fb0,但是在后来的版本中,实现可以多样化了,比如高通采用SDM,其他有些平台采用ADF,DRM等。

目前SurfaceFlinger中支持两种合成方式,一种是Device合成,一种是Client合成。SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问 Hardware Composer 应如何进行合成。
 1.Client合成 
Client合成方式是相对与硬件合成来说的,其合成方式是,将各个Layer的内容用GPU渲染到暂存缓冲区中,最后将暂存缓冲区传送到显示硬件。这个暂存缓冲区,我们称为FBTarget,每个Display设备有各自的FBTarget。Client合成,之前称为GLES合成,我们也可以称之为GPU合成。Client合成,采用RenderEngine进行合成。
 2.Device合成 
就是用专门的硬件合成器进行合成HWComposer,所以硬件合成的能力就取决于硬件的实现。其合成方式是将各个Layer的数据全部传给显示硬件,并告知它从不同的缓冲区读取屏幕不同部分的数据。HWComposer是Devicehec的抽象。

  Android 7.0 包含新版本的 HWC (HWC2),Android需要自行配置,到Android 8.0,HWC2正式开启,且版本升级为2.1版本。HWC2是 SurfaceFlinger 用来与专门的窗口合成硬件进行通信。SurfaceFlinger 包含使用 3D 图形处理器 (GPU) 执行窗口合成任务的备用路径,但由于以下几个原因,此路径并不理想.
  从Android 8.0开始的Treble项目,对Android的架构做了重大的调整,让制造商以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。这就对 HAL 层有了很大的调整,利用提供给Vendor的接口,将Vendor的实现和Android上层分离开来。
  这样的架构让HWC的架构也变的复杂,HWC属于Binderized的HAL类型。Binderized类型的HAL,将上层Androd和底层HAL分别采用两个不用的进程实现,中间采用Binder进行通信,为了和前面的Binder进行区别,这里采用HwBinder。

按照数据格式分,可以分为RGB Layer,YUV Layer。
 RGB Layer 
Buffer是RGB格式,比较常见的就是UI界面的数据。
 YUV Layer 
Buffer是YUV类型的,平常播放Video,Camera预览等,都是YUV类型的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android的图层合成是指将多个图层(包括应用程序界面、系统界面等)合成为最终显示在屏幕上的图像的过程。在Android中,图层合成可以通过硬件device合成)或者软件(client合成)进行。 Device合成是由硬件图形加速器完成的,它直接在GPU中合成图层。这种方式可以提供更高的性能和更流畅的动画效果,因为GPU可以并行处理多个图层。设备合成还可以利用硬件硬件加速特性,例如硬件缩放和旋转。 Client合成是由软件完成的,它在CPU上进行图层合成。这种方式在一些旧版本的Android设备上可能会使用,或者在某些情况下(例如GPU不可用或被禁用)会回退到软件合成Client合成的性能可能会受到CPU性能的限制。 Android系统会根据设备的硬件性能和配置自动选择使用device合成还是client合成。通常情况下,Android会尽量使用device合成以获得更好的性能和用户体验。但在某些情况下,例如在一些低端设备上或者由于特定配置要求,可能会使用client合成。 对于开发者来说,一般情况下无需直接控制device合成client合成,因为Android会自动根据设备的能力进行选择。但可以通过一些系统属性或者开发者选项来调整图层合成的行为,例如开启或关闭硬件加速、调整渲染优先级等。 总结来说,Android的图层合成可以通过硬件device合成)或者软件(client合成)进行,系统会根据设备的能力自动选择合适的方式。对于开发者来说,一般情况下无需直接控制,但可以通过一些选项进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值