SurfaceFlinger的原理

一、SurfaceFlinger的原理

SurfaceFlinger是Android系统中负责屏幕显示内容合成的服务,它接收来自多个应用程序和系统服务的图像缓冲区,根据它们的位置、大小、透明度、Z轴顺序等属性,将它们合成到一个最终的缓冲区中,然后发送到显示设备上。

二、SurfaceFlinger的作用

SurfaceFlinger的作用是将所有的Surface和其他层合成到屏幕上,形成最终的显示效果。

Surface是一个包含BufferQueue和SurfaceControl的对象

BufferQueue是一个缓冲区队列,用于存储图像数据

SurfaceControl是一个包含层元数据的对象,用于控制Surface的显示属性。

Surface可以由应用程序或者系统服务创建,例如WindowManager、MediaServer、CameraService等。

SurfaceFlinger会根据Surface的属性,将它们分为不同的类型,例如OVERLAY、SIDEBAND、SOLID_COLOR、CLIENT等。

SurfaceFlinger会尽可能地将Surface标记为OVERLAY类型,表示可以直接将Surface的缓冲区合成到屏幕上,而不需要经过SurfaceFlinger的处理。

如果Surface不能被标记为OVERLAY类型,那么它们就会被标记为CLIENT类型,表示需要由SurfaceFlinger来进行合成。

除了Surface之外,SurfaceFlinger还会合成其他的层,例如BootAnimation、Framebuffer、ColorLayer等。这些层的作用是显示一些特殊的内容,例如开机动画、截屏、色彩校正等。

三、SurfaceFlinger的架构

从上图可以看出,SurfaceFlinger的架构主要包含以下几个部分:

  1. App和Service:这些是Surface的创建者,它们可以通过SurfaceHolder或者SurfaceTexture等方式来创建和操作Surface,例如设置Surface的大小、位置、透明度等属性,或者向Surface的BufferQueue中提交图像数据。

  2. Surface:这是SurfaceFlinger的合成对象,它包含一个BufferQueue和一个SurfaceControl,BufferQueue用于存储图像数据,SurfaceControl用于控制Surface的显示属性。 Surface在创建时,会向SurfaceFlinger注册,让SurfaceFlinger知道它的存在,并根据它的属性来进行合成。

  3. SurfaceFlinger:这是屏幕显示内容合成的服务,它包含一个Looper线程和一个EventThread线程 Looper线程 用于接收和处理来自Binder的消息,例如创建、销毁、更新Surface等 EventThread线程 用于接收和处理来自显示设备的VSYNC信号,VSYNC信号是一个垂直同步信号,表示显示设备可以接收新的缓冲区而不会产生撕裂现象。 SurfaceFlinger会在收到VSYNC信号后,触发一次合成操作。SurfaceFlinger还会与Hardware Composer进行通信,询问应该如何进行合成,Hardware Composer是一个硬件抽象层,用于利用硬件加速的方式来合成Surface,提高性能和节省电量。

  4. Hardware Composer:这是一个硬件抽象层,用于利用硬件加速的方式来合成Surface,提高性能和节省电量。 Hardware Composer会根据Surface的属性,将它们分为不同的类型,例如OVERLAY、SIDEBAND、SOLID_COLOR、CLIENT等。 Hardware Composer会尽可能地将Surface标记为OVERLAY类型,表示可以直接将Surface的缓冲区合成到屏幕上,而不需要经过SurfaceFlinger的处理。 如果Surface不能被标记为OVERLAY类型,那么它们就会被标记为CLIENT类型,表示需要由SurfaceFlinger来进行合成。 Hardware Composer还会返回一个DisplayFrame,表示Surface在屏幕上的位置和大小。 Hardware Composer会将合成后的缓冲区发送到显示设备上,完成绘制流程。

  5. Display:这是显示设备,用于展示合成后的缓冲区,形成最终的显示效果。 Display会向SurfaceFlinger发送VSYNC信号,表示可以接收新的缓冲区而不会产生撕裂现象。 Display还会向SurfaceFlinger反馈一些信息,例如显示设备的分辨率、刷新率、色彩空间等。

四、SurfaceFlinger的启动流程

从上图可以看出,SurfaceFlinger的启动过程主要包含以下几个步骤:

  1. init:这是Android系统的初始化进程,它负责启动各种系统服务,包括SurfaceFlinger。init会读取init.rc文件,根据其中的配置,启动SurfaceFlinger进程,并传递一些参数,例如日志级别、调试选项等。
  2. SurfaceFlinger:这是屏幕显示内容合成的服务,它是一个独立的进程,由init启动。SurfaceFlinger会执行main()函数,该函数是SurfaceFlinger的入口函数,它会调用initSurfaceFlinger()函数,该函数是SurfaceFlinger的初始化函数,它会完成SurfaceFlinger的各种初始化工作。
  3. main():这是SurfaceFlinger的入口函数,它会调用initSurfaceFlinger()函数,该函数是SurfaceFlinger的初始化函数,它会完成SurfaceFlinger的各种初始化工作。 initSurfaceFlinger():这是SurfaceFlinger的初始化函数,它会完成SurfaceFlinger的各种初始化工作,包括以下几个方面:
  • 创建一个Looper线程,用于接收和处理来自Binder的消息,例如创建、销毁、更新Surface等。
  • 创建一个EventThread线程,用于接收和处理来自显示设备的VSYNC信号,VSYNC信号是一个垂直同步信号,表示显示设备可以接收新的缓冲区而不会产生撕裂现象。SurfaceFlinger会在收到VSYNC信号后,触发一次合成操作。
  • 初始化Hardware Composer,Hardware Composer是一个硬件抽象层,用于利用硬件加速的方式来合成Surface,提高性能和节省电量。SurfaceFlinger会与Hardware Composer进行通信,询问应该如何进行合成,Hardware Composer会根据Surface的属性,将它们分为不同的类型,例如OVERLAY、SIDEBAND、SOLID_COLOR、CLIENT等。Hardware Composer会尽可能地将Surface标记为OVERLAY类型,表示可以直接将Surface的缓冲区合成到屏幕上,而不需要经过SurfaceFlinger的处理。如果Surface不能被标记为OVERLAY类型,那么它们就会被标记为CLIENT类型,表示需要由SurfaceFlinger来进行合成。Hardware Composer还会返回一个DisplayFrame,表示Surface在屏幕上的位置和大小。
  • 获取显示设备的信息,例如显示设备的分辨率、刷新率、色彩空间等。SurfaceFlinger会根据这些信息,来设置Surface的大小、位置、格式等属性,以适应显示设备的特性。SurfaceFlinger还会向显示设备注册一个回调函数,用于接收显示设备的状态变化,例如连接、断开、旋转等。
相关推荐
老白讲技术4 小时前
2026年国内APP开发与软件定制服务商能力观察:从AI应用到行业系统开发
大数据·人工智能·ai·app·软件需求·app开发
私人珍藏库6 小时前
[Android] 一木百宝箱-万能百宝箱+抖音去水印等几百种功能
android·人工智能·app·软件·多功能
_瑞1 天前
深入理解灵动岛
前端·ios·app
私人珍藏库2 天前
[Android] BBLL 开源第三方B哩电视TV端
android·app·生活·工具·多功能
私人珍藏库3 天前
[Android] zip解压缩管理-全格式压缩包一键解压+打包
android·app·生活·工具·多功能
Fansi6 天前
iOS 实时活动(Live Activity)开发指南
app
duanze6 天前
从零开始Android商业项目Vibe coding完全指南(八)
app·vibecoding
Bigger12 天前
Tauri (26)——托盘图标总对不上系统主题?一行 Template Image 搞定
前端·rust·app
duanze16 天前
从零开始Android商业项目Vibe coding完全指南(七)
app·vibecoding
方白羽21 天前
一份 AGENTS.md,让 Android AI 代码规范率飙升
android·app·客户端