1. SurfaceFlinger背景知识

SurfaceFlinger 是一个独立的Service, 它接收所有Window的Surface作为输入,根据ZOrder, 透明度,大小,位置等参数,计算出每个Surface在最终合成图像中的位置,然后交由HWComposer或OpenGL生成最终的显示Buffer, 然后显示到特定的显示设备上。

下面首先介绍下相关概念:
        Surface——在Android中,Window与Surface一一对应。 如果说Window关心的是层次和布局,是从设计者角度定义的类,Surface则从实现角度出发,是工程师关心和考虑的类。Window的内容是变化 的,Surface需要有空间来记录每个时刻Window的内容。在Android的SurfaceFlinger实现里,通常一个Surface有两块 Buffer, 一块用于绘画,一块用于显示,两个Buffer按照固定的频率进行交换,从而实现Window的动态刷新。

Layer——Layer是SurfaceFlinger 进行合成的基本操作单元。Layer在应用请求创建Surface的时候在SurfaceFlinger内部创建,因此一个Surface对应一个 Layer, 但注意,Surface不一定对应于Window,Android中有些Surface并不跟某个Window相关,而是有程序直接创建,比如说 SurfaceView, 用于显示有硬件输出的视频内容等。
当多个Layer进行合成的时候,并不是整个Layer的空间都会被完全显示,根据这个Layer最终的显示效果,一个Layer可以被划分成很多的Region, Android SurfaceFlinger 定义了以下一些Region类型:
        TransparantRegion: 完全透明的区域,在它之下的区域将被显示出来。
        OpaqueRegion:  完全不透明的区域,是否显示取决于它上面是否有遮挡或是否透明。
        VisibleRegion:  可见区域,包括完全不透明无遮挡区域或半透明区域
                                  visibleRegion = Region - above   OpaqueRegion.
        CoveredRegion:  被遮挡区域,在它之上,有不透明或半透明区域。
        DirtyRegion:  可见部分改变区域,包括新的被遮挡区域,和新的露出区域。

如上图所示,应用程序的每个Surface都对应一个SurfaceFlinger端的Layer,每个Layer都有两个buffer可以用(Android4.1后有三个buffer可以用,此处以两个buffer举例说明),一个前端buffer,一个后端buffer,前端buffer用于显示,后端buffer用于绘制,SurfaceFlinger所要做的事情就是把后端buffer绘制完成后需要显示的buffer进行合成,合成到framebuffer上,然后丢给Display去显示。

2. surfaceflinger的工作流程

当Surface绘制完成后会发出一个Invalidate的消息给Surfaceflinger的等待线程,当waitForEvent接收到消息后就会交给onMessageReceivered去处理,处理过程中会依次调用handleMessageTransaction、handleMessageInvalidate、handleMessageRefresh接口。

handleMessageTransaction——主要处理之前对屏幕和应用程序窗口的改动。窗口状态的改变只能在一个Transaction中进行。因为窗口状态的改变可能造成本窗口和其他窗口的可见区域变化,所以就必须重新来计算窗口的可见区域。在这个处理子过程中Android会根据标志位来对所有layer进行遍历,一旦发现哪个窗口的状态发生了变化就设置标志位以在将来重新计算这个窗口的可见区域。

handleMessageInvalidate——主要调用handlePageFlip()函数,该函数主要是从各Layer对应的BufferQueue中拿图形缓冲区数据,并根据内容更新脏区域。

handleMessageRefresh——就是合并和渲染输出了。作为重头戏,这步步骤多一些,大体框架如下:

合并渲染完成后,该线程继续等待下一个invalidate消息。

SurfaceFlinger简介相关推荐

  1. Android SurfaceFlinger 学习之路(五)----VSync 工作原理

    原址 VSync信号的科普我们上一篇已经介绍过了,这篇我们要分析在SurfaceFlinger中的作用.(愈发觉得做笔记对自己记忆模块巩固有很多帮助,整理文章不一定是用来给别人看的,但一定是为加强自己 ...

  2. android图形框架之surfaceflinger分析(一)

    1. 概念 surfaceflinger作用是接受多个来源的图形显示数据,将它们合成,然后发送到显示设备.比如打开应用,常见的有三层显示,顶部的statusbar底部或者侧面的导航栏以及应用的界面,每 ...

  3. 安卓dumpsys SurfaceFlinger输出示例

    adb shell dumpsys SurfaceFlinger 结果输出示例 Build configuration: [sf PRESENT_TIME_OFFSET=0 FORCE_HWC_FOR ...

  4. 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

    Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...

  5. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

  6. [linux小水滴]systrace工具使用简介

    目录 1 简介 2 用法 3 实际操作 4 用systrace分析问题思路 4.1 功耗问题分析 5 参考链接 1 简介 在短时间内记录设备活动被称为systrace.这里所说的systrace是安卓 ...

  7. Android渲染画面,Android系统图像渲染简介

    原标题:Android系统图像渲染简介 Android系统UI从绘制到显示至屏幕一般为如图过程:先从相应的图片解码获得位图数据放到内存.然后使用图形引擎将位图数据按一定方式,渲染到可用于显示的图形内存 ...

  8. LWN 翻译:Atomic Mode Setting 设计简介(上)

    !!!声明!!! 本文章转自:何小龙 链接:https://blog.csdn.net/hexiaolong2009/article/details/87392266 转载只是为了学习备份. 译者注 ...

  9. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

最新文章

  1. 演示:动态路由协议RIPv1的配置
  2. The mountain is unchanged,but the heart is changed
  3. 学python要多少钱-Python培训一般要多少钱?
  4. Python 机动车强制报废公告--参数分析与实现
  5. (chap5 web服务器) 虚拟主机
  6. Hadoop手动升级HA配置手册
  7. html中通过点击button标签实现页面跳转的三种方法
  8. 快速傅立叶变换(FFT)的海面模拟
  9. 深交所与工信部签署优质中小企业上市培育战略合作协议
  10. 商品二因素、劳动二重性
  11. java 对象赋值给scala_将Scala变量转换为Java对象… varargs
  12. 在python语言中定义私有成员变量的方法是_Python在类中有“私有”变量吗?
  13. log 日志 php tp5,TP5自定义日志记录到文件方法
  14. html天天生鲜项目,day54-天天生鲜项目订单管理
  15. 1、AD创建模板和导入
  16. 理解offset in Python
  17. 初探springboot的荆棘之路
  18. vmware14克隆后UUID相同的解决方法
  19. 你未必知的拼音打字快打十招
  20. ZT——你怎么过河? -在CMM实践中你是否愿意多走1公里-软件工程 CMM与过程改进

热门文章

  1. 笔记本左边USB3.0接口没反应的解决办法
  2. 盘点Python的6个优势与特点
  3. php防止文件盗链,如何在PHP程序中防止盗链
  4. 如何破解Excel密码保护?
  5. 超详细理解Gamma分布,Beta分布,多项式分布,Dirichlet狄利克雷分布
  6. Java XML教程(汇总)
  7. QNAP NAS添加计划任务
  8. 今日份推荐:7 款电脑好用的小工具
  9. 智源AI日报(2022-08-26):当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
  10. 《C语言的自学教程 》,《自学C语言》初级教程 - 目录