SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕。

SurfaceFlinger
SurfaceFlinger 可通过两种方式接受缓冲区:通过 BufferQueue 和 SurfaceControl,或通过 ASurfaceControl。

SurfaceFlinger 接受缓冲区的一种方式是通过 BufferQueue 和 SurfaceControl。当应用进入前台时,它会从 WindowManager 请求缓冲区。然后,WindowManager 会从 SurfaceFlinger 请求层。层是 surface(包含 BufferQueue)和 SurfaceControl(包含显示框架等层元数据)的组合。SurfaceFlinger 创建层并将其发送至 WindowManager。然后,WindowManager 将 Surface 发送至应用,但会保留 SurfaceControl 来操控应用在屏幕上的外观。

Android 10 新增了 ASurfaceControl,这是 SurfaceFlinger 接受缓冲区的另一种方式。ASurfaceControl 将 Surface 和 SurfaceControl 组合到一个事务包中,该包会被发送至 SurfaceFlinger。ASurfaceControl 与层相关联,应用可通过 ASurfaceTransactions 更新该层。然后,应用可通过回调(用于传递包含锁定时间、获取时间等信息的 ASurfaceTransactionStats)获取有关 ASurfaceTransactions 的信息。

下表包含有关 ASurfaceControl 及其相关组件的更多详细信息。

组件    说明
ASurfaceControl    对 SurfaceControl 进行封装并使应用能够创建与屏幕上的各层相对应的 SurfaceControl。

可作为 ANativeWindow 的一个子级或者另一个 ASurfaceControl 的子级创建。
ASurfaceTransaction    对事务进行包装,以使客户端能够修改层的描述性属性(比如几何图形),并将经过更新的缓冲区发送至 SurfaceFlinger。
ASurfaceTransactionStats    通过预先注册的回调将有关已显示事务的信息(比如锁定时间、获取时间和上一个释放栅栏)发送至应用。
虽然应用可以随时提交缓冲区,但 SurfaceFlinger 仅能在屏幕处于两次刷新之间时唤醒,以接受缓冲区,这会因设备而异。这样可以最大限度地减少内存使用量,并避免屏幕上出现可见的撕裂现象(如果显示内容在刷新期间更新,则会出现此现象)。

在屏幕处于两次刷新之间时,屏幕会向 SurfaceFlinger 发送 VSYNC 信号。VSYNC 信号表明可对屏幕进行刷新而不会产生撕裂。当 SurfaceFlinger 接收到 VSYNC 信号后,SurfaceFlinger 会遍历其层列表,以查找新的缓冲区。如果 SurfaceFlinger 找到新的缓冲区,SurfaceFlinger 会获取缓冲区;否则,SurfaceFlinger 会继续使用上一次获取的那个缓冲区。SurfaceFlinger 必须始终显示内容,因此它会保留一个缓冲区。如果在某个层上没有提交缓冲区,该层会被忽略。

SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问硬件混合渲染器 (HWC) 应如何进行合成。如果 HWC 将层合成类型标记为客户端合成,则 SurfaceFlinger 将合成这些层。然后,SurfaceFlinger 会将输出缓冲区传递给 HWC。

WindowManager
WindowManager 会控制窗口对象,它们是用于容纳视图对象的容器。窗口对象始终由 Surface 对象提供支持。WindowManager 会监督生命周期、输入和聚焦事件、屏幕方向、转换、动画、位置、变形、Z 轴顺序以及窗口的许多其他方面。WindowManager 会将所有窗口元数据发送到 SurfaceFlinger,以便 SurfaceFlinger 可以使用这些数据在屏幕上合成 Surface。

预旋转
许多硬件叠加层不支持旋转(即使支持,也需要耗用处理能力);解决方案就是在缓冲区到达 SurfaceFlinger 之前对其进行转换。Android 在 ANativeWindow 中支持查询提示 (NATIVE_WINDOW_TRANSFORM_HINT),以表示最有可能由 SurfaceFlinger 应用于缓冲区的转换。GL 驱动程序可以使用此提示在缓冲区到达 SurfaceFlinger 之前对其进行预转换,以便在缓冲区到达时能对其进行正确的转换。

例如,当接收到旋转 90 度的提示时,会生成一个矩阵并将其应用于缓冲区,以防止其从页面末尾运行。为了节省电量,请进行此预旋转。如需了解详情,请参阅 system/core/include/system/window.h 中定义的 ANativeWindow 接口。

SurfaceFlinger 和 WindowManager相关推荐

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

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

  2. WMS 概述 -- “窗口管理员“

    WMS 概述 -- "窗口管理员" 1.WMS 职责 2.涉及元素 3.WMS.AMS与Activity间的关系 4.SurfaceFlinger 和 WindowManager ...

  3. WindowManager如何被Android深度解析(3)

    前言 在此前的系列文章中我们学习了WindowManager体系和Window的属性,这一篇我们接着来讲Window的添加过程.建议阅读此篇文章前先阅读本系列的前两篇文章. 1.概述 WindowMa ...

  4. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    出自:http://blog.csdn.net/luoshengyang/article/details/8079456 在前面的一系列文章中,我们学习了Android应用程序与SurfaceFlin ...

  5. android surfaceflinger 老罗,「Android」SurfaceFlinger分析

    本篇针对surfaceFlinger模块进行分析,目录如下: 1.SurfaceFlinger功能 1.1.BufferQueue原理(native/libs/gui模块) 1.2   layer显示 ...

  6. SurfaceFlinger 和 Hardware Composer

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

  7. Android SurfaceFlinger

    Android 系统启动过程 Activity 创建过程 Activity 与 Window 与 View 之间的关系 Android 系统从按下开机键到桌面,从桌面点击 App 图标到 Activi ...

  8. SurfaceFlinger与Hardware Composer

    SurfaceFlinger 和 Hardware Composer HAL 通过执行以下四项关键任务来准备用于显示的图形数据缓冲区: 接受缓冲区 确定合成缓冲区的最有效方法 合成缓冲区 将缓冲区发送 ...

  9. SurfaceFlinger draw/render/display流程(fps)

    前言:那些年我们用过的显示性能指标 相对其他 Android 性能指标(如内存.CPU.功耗等)而言,显示性能(包括但不仅限于我们常说的"流畅度")的概念本来就相对复杂.让我们更蛋 ...

最新文章

  1. 虚拟机网络连接方式linuxcentos
  2. phpcms开启、关闭在线编辑模板的方法
  3. 比较字符串a和b的大小
  4. Arduino--DHT11温湿度传感器
  5. antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型
  6. 大型网站技术架构(三)--架构核心要素(转)
  7. Netty工作笔记0011---Channel应用案例2
  8. 我的成长笔记20210402(测试文档编写)
  9. 软件项目经理新手上路10 - 要的是计划,还是?
  10. 【Unity优化】怎样实现Unity编辑器中的协程
  11. 学术论文-结果描述常用表达
  12. curl如何发送json数据?如何发送form数据?python的restfull又该如何获取这些数据?...
  13. python小程序代码_Python解题记录第19题
  14. 计算机常用英语词汇 短语,四级英语常用词汇短语
  15. Linux修改文件保存时报错E45: 已设定选项 ‘readonly‘ (请加 ! 强制执行)
  16. 威廉希尔赔率分析和结论
  17. k8s调试工具--busybox
  18. 车联网的发展现状前景趋势及挑战
  19. geotools 创建表自定义主键
  20. Python from . import 模块 是什么意思?

热门文章

  1. nginx+php-fpm配置后页面显示空白的解决方法以及用nginx和php-fpm解决“502 Bad Gateway”问题...
  2. filestream streamreader
  3. linux中搭建java开发环境
  4. tomcat-maven-plugin 2.0版本发布
  5. document.all用法
  6. EBS系统请求表定时清除
  7. linux下自动补全问题: autocomplete sh: ( compgen -d — ” ): No such file or directory
  8. 详细讲解怎样做数据仓库需求分析
  9. 2014年国内最热门的.NET开源项目TOP25
  10. 用IT技术玩金融系列文章