SurfaceFlinger与Hardware Composer
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 会执行以下计算:
- SurfaceFlinger 向 HWC 提供一个完整的层列表,并询问“您希望如何处理这些层?”
- HWC 的响应方式是将每个层标记为叠加层或 GLES 合成。
- 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相关推荐
- SurfaceFlinger 和 Hardware Composer
拥有图形数据缓冲区是很精彩的,但是当你在你的设备屏幕上看到它们时生活甚至更美好.那就是 SurfaceFlinger 和 Hardware Composer HAL 做的事情. SurfaceFlin ...
- Hardware Composer
Hardware Composer HAL (HWC) Composer: 作曲家.设计者,这里我觉得翻译成 混合者 比较合适,就是把不同的view layer混合起来 HAL : 硬件抽象层 在An ...
- 用两张图告诉你,为什么你的App会卡顿?
有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...
- Android 图形架构
每一个开发者都应该了解的关于 Surface,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture,TextureView ...
- 【面试必备】深入分析App卡顿原因及优化建议
有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...
- 图形相关知识(显示)
1. 图形 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bepS0Lhf-1630391870991)(https://source.android.com/devi ...
- Android性能优化:定性和定位Android图形性能问题——以后台录屏进程为例
原文链接:https://juejin.cn/post/7096288511053004830 作者github:https://github.com/NasdaqGodzilla 简介 发现.定性与 ...
- note_2019_7
MSM8909W watch项目编译问题: Checking build tools versions... ********************************************* ...
- android display 框架,高通android display subsystem
转自:http://blog.csdn.net/shichaog/article/details/61191716 MDSS:Multimedia Display Sub-system Display ...
最新文章
- 力扣(LeetCode)刷题,简单题(第27期)
- 技巧:利用 Python 实现多任务进程
- MySQL数据库入门———常用基础命令
- 30岁转行测试工程师_30岁一无所长,转行UI设计还合适吗?
- request payload怎么发_做了一个个人博客,但不知道怎么介绍
- 图神经网络学习笔记(1)——图信号与图傅里叶变换
- AT88SC104 加密认证过程
- img标签中alt属性与title属性
- sb3转换html,scratch3程序如何转成HTML和制作成exe文件转换心得(小白篇)!
- 2021全国高校计算机能力挑战赛程序设计赛Python组区域赛(初赛)试题及部分个人解答
- 【word】双栏写作如何调整为写满左栏再写右栏
- Jetson部署实践
- qt之QLabel图片自适应
- css3布局的若干笔记总结
- ZooKeeper之分布式环境搭建
- 卸载计算机程序有几种方法,电脑上如何卸载软件 卸载软件的三个办法
- 谷歌SEO优化技巧方法
- arduino连接WiFi
- Pad居然可以写代码了?研究完我惊了,居然是中国创业公司的产品
- msde和sql 区别_对MSDE SQL说再见
热门文章
- for of 与 for in的区别
- 阿里要把雄安打造成AI第一城:未来30年城市长啥样?
- 阿里云ECS主机 Ubuntu下设置Mysql 5.7.17为远程访问
- [Share]前端开发大众手册(包括工具、网址、经验等)
- 深思 JAVA IT 求职
- 重定位代码Repair
- mysql自动化巡检_mysql自动化巡检脚本生成html报告
- IEC,ASTM,ISO,DIN,JIS等国际标准网站
- Vue学习笔记之03v-on事件监听
- mysql group 索引失效_介绍mysql索引失效的情况