SurfaceFlinger 和 Hardware Composer HAL 通过执行以下四项关键任务来准备用于显示的图形数据缓冲区:

  • 接受缓冲区
  • 确定合成缓冲区的最有效方法
  • 合成缓冲区
  • 将缓冲区发送到显示设备

SurfaceFlinger

SurfaceFlinger 接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备。

当应用进入前台时,WindowManager 服务会向 SurfaceFlinger 请求一个绘图 Surface。SurfaceFlinger 会创建一个其主要组件为 BufferQueue 的层,而 SurfaceFlinger 是其消耗方。生产方端的 Binder 对象通过 WindowManager 传递到应用,然后应用可以开始直接将帧发送到 SurfaceFlinger。

大多数应用在屏幕上一次显示三个层:屏幕顶部的状态栏、底部或侧面的导航栏以及应用界面。有些应用会拥有更多或更少的层(例如,默认主屏幕应用有一个单独的壁纸层,而全屏游戏可能会隐藏状态栏)。每个层都可以单独更新。状态栏和导航栏由系统进程渲染,而应用层由应用渲染,两者之间不进行协调。

设备显示会按一定速率刷新,在手机和平板电脑上通常为 60 fps。如果显示内容在刷新期间更新,则会出现撕裂现象;因此,请务必只在周期之间更新内容。在可以安全更新内容时,系统便会收到来自显示设备的信号。由于历史原因,我们将该信号称为 VSYNC 信号。

刷新率可能会随时间而变化,例如,一些移动设备的帧率范围在 58 fps 到 62 fps 之间,具体要视当前条件而定。对于连接了 HDMI 的电视,刷新率在理论上可以下降到 24 Hz 或 48 Hz,以便与视频相匹配。由于每个刷新周期只能更新屏幕一次,因此以 200 fps 的帧率为显示设备提交缓冲区就是一种资源浪费,因为大多数帧会被舍弃掉。SurfaceFlinger 不会在应用每次提交缓冲区时都执行操作,而是在显示设备准备好接收新的缓冲区时才会唤醒。

当 VSYNC 信号到达时,SurfaceFlinger 会遍历它的层列表,以寻找新的缓冲区。如果找到新的缓冲区,它会获取该缓冲区;否则,它会继续使用以前获取的缓冲区。SurfaceFlinger 必须始终显示内容,因此它会保留一个缓冲区。如果在某个层上没有提交缓冲区,则该层会被忽略。

SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问 Hardware Composer 应如何进行合成。

Hardware Composer

Hardware Composer HAL (HWC) 用于确定通过可用硬件来合成缓冲区的最有效方法。作为 HAL,其实现是特定于设备的,而且通常由显示设备硬件原始设备制造商 (OEM) 完成。

当您考虑使用叠加平面时,很容易发现这种方法的好处,它会在显示硬件(而不是 GPU)中合成多个缓冲区。例如,假设有一部普通 Android 手机,其屏幕方向为纵向,状态栏在顶部,导航栏在底部,其他区域显示应用内容。每个层的内容都在单独的缓冲区中。您可以使用以下任一方法处理合成:

  • 将应用内容渲染到暂存缓冲区中,然后在其上渲染状态栏,再在其上渲染导航栏,最后将暂存缓冲区传送到显示硬件。
  • 将三个缓冲区全部传送到显示硬件,并指示它从不同的缓冲区读取屏幕不同部分的数据。

后一种方法可以显著提高效率。

显示处理器功能差异很大。叠加层的数量(无论层是否可以旋转或混合)以及对定位和叠加的限制很难通过 API 表达。为了适应这些选项,HWC 会执行以下计算:

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

由于硬件供应商可以定制决策代码,因此可以在每台设备上实现最佳性能。

当屏幕上的内容没有变化时,叠加平面的效率可能会低于 GL 合成。当叠加层内容具有透明像素且叠加层混合在一起时,尤其如此。在此类情况下,HWC 可以选择为部分或全部层请求 GLES 合成,并保留合成的缓冲区。如果 SurfaceFlinger 返回来要求合成同一组缓冲区,HWC 可以继续显示先前合成的暂存缓冲区。这可以延长闲置设备的电池续航时间。

运行 Android 4.4 或更高版本的设备通常支持 4 个叠加平面。尝试合成的层数多于叠加层数会导致系统对其中一些层使用 GLES 合成,这意味着应用使用的层数会对能耗和性能产生重大影响。

虚拟显示设备

SurfaceFlinger 支持一个主要显示设备(即内置在手机或平板电脑中的显示屏)、一个外部显示设备(如通过 HDMI 连接的电视)以及一个或多个令合成的输出在系统中可用的虚拟显示设备。虚拟显示设备可用于记录屏幕信息或通过网络发送屏幕信息。

虚拟显示设备可以与主显示设备共享相同的一组层(层堆叠),也可拥有自己的一组层。虚拟显示设备没有 VSYNC,因此主显示设备的 VSYNC 用于为所有显示设备触发合成。

在旧版本的 Android 中,虚拟显示设备总是通过 GLES 合成,而 Hardware Composer 管理的合成仅用于主显示设备。在 Android 4.4 中,Hardware Composer 能够参与虚拟显示设备合成。

正如您所预期的,为虚拟显示设备生成的帧会写入 BufferQueue。

SurfaceFlinger与Hardware Composer相关推荐

  1. SurfaceFlinger 和 Hardware Composer

    拥有图形数据缓冲区是很精彩的,但是当你在你的设备屏幕上看到它们时生活甚至更美好.那就是 SurfaceFlinger 和 Hardware Composer HAL 做的事情. SurfaceFlin ...

  2. Hardware Composer

    Hardware Composer HAL (HWC) Composer: 作曲家.设计者,这里我觉得翻译成 混合者 比较合适,就是把不同的view layer混合起来 HAL : 硬件抽象层 在An ...

  3. 用两张图告诉你,为什么你的App会卡顿?

    有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...

  4. Android 图形架构

    每一个开发者都应该了解的关于 Surface,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture,TextureView ...

  5. 【面试必备】深入分析App卡顿原因及优化建议

    有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...

  6. 图形相关知识(显示)

    1. 图形 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bepS0Lhf-1630391870991)(https://source.android.com/devi ...

  7. Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例

    原文链接:https://juejin.cn/post/7096288511053004830 作者github:https://github.com/NasdaqGodzilla 简介 发现.定性与 ...

  8. note_2019_7

    MSM8909W watch项目编译问题: Checking build tools versions... ********************************************* ...

  9. android display 框架,高通android display subsystem

    转自:http://blog.csdn.net/shichaog/article/details/61191716 MDSS:Multimedia Display Sub-system Display ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第27期)
  2. 技巧:利用 Python 实现多任务进程
  3. MySQL数据库入门———常用基础命令
  4. 30岁转行测试工程师_30岁一无所长,转行UI设计还合适吗?
  5. request payload怎么发_做了一个个人博客,但不知道怎么介绍
  6. 图神经网络学习笔记(1)——图信号与图傅里叶变换
  7. AT88SC104 加密认证过程
  8. img标签中alt属性与title属性
  9. sb3转换html,scratch3程序如何转成HTML和制作成exe文件转换心得(小白篇)!
  10. 2021全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及部分个人解答
  11. 【word】双栏写作如何调整为写满左栏再写右栏
  12. Jetson部署实践
  13. qt之QLabel图片自适应
  14. css3布局的若干笔记总结
  15. ZooKeeper之分布式环境搭建
  16. 卸载计算机程序有几种方法,电脑上如何卸载软件 卸载软件的三个办法
  17. 谷歌SEO优化技巧方法
  18. arduino连接WiFi
  19. Pad居然可以写代码了?研究完我惊了,居然是中国创业公司的产品
  20. msde和sql 区别_对MSDE SQL说再见

热门文章

  1. for of 与 for in的区别
  2. 阿里要把雄安打造成AI第一城:未来30年城市长啥样?
  3. 阿里云ECS主机 Ubuntu下设置Mysql 5.7.17为远程访问
  4. [Share]前端开发大众手册(包括工具、网址、经验等)
  5. 深思 JAVA IT 求职
  6. 重定位代码Repair
  7. mysql自动化巡检_mysql自动化巡检脚本生成html报告
  8. IEC,ASTM,ISO,DIN,JIS等国际标准网站
  9. Vue学习笔记之03v-on事件监听
  10. mysql group 索引失效_介绍mysql索引失效的情况