SurfaceFlinger简述

SurfaceFlinger简述

简述

SurfaceFlinger是Android系统GUI中重要的一环,核心功能是根据硬件Vsync模拟软件Vsync信号(给应用渲染和自身合成使用),将应用渲染好的Surface数据进行合成显示(包括使用gpu软件合成和hwc硬件合成)。我们将基于Android 14的源码对SurfaceFlinger进行探究学习。

前置概念

在开始学习前我们需要了解一些前置概念以及SurfaceFlinger大体的流程,这样会有助于我们后续看源码学习,否则经常会出现完全不知道当前代码要干什么的情况。

渲染

首先先说一下渲染,初学者会觉得这个概念很抽象,我们说的渲染是什么呢,其实很简单,如果做过应用开发写过自定义View的同学们一定接触过canvas,我们在onDraw里面使用canvas的各种api绘制我们想要的图像,但是最终显示器驱动需要的数据是和位图类似的数据,就是一堆表示颜色的像素点,而将通过canvas调用api描述的图像转化为类似位图的数据这个过程就叫渲染。

软件渲染和硬件渲染:

硬件渲染就是通过gpu来实现上面这个过程,Android中使用的是opengl,我们不会对opengl做太多的研究,因为本章重点是SurfaceFlinger,大家可以简单理解为opengl是我们用来控制gpu实现渲染点api就行。
软件渲染就是通过软件逻辑实现上面这个过程,以前的Android通过canvas描述的2D图像,后面会使用hwui进行软件渲染,但是在最近几个版本的Android hwui的实现也是通过opengel,所以也会使用硬件渲染。
所以现在Android基本上都会使用硬件渲染,硬件渲染的速度会比软件渲染的速度快很多。

VSync

Vsync是垂直同步信号,这个是用于约束渲染速度的信号,主要是为了防止出现“撕裂”的情况,所谓“撕裂”,就是画面分离的,一个图像被分成两个图像。出现这个问题的原因是渲染和显示的速度不同导致的。举个例子。显示器刷新率是60HZ,而GPU渲染速度一秒钟更新90次,这样相当于显示器显示一帧的时间gpu可以渲染1.5屏图片,那么就会出现屏幕显示的时候,显示出第一帧的1/2图像和第二帧的1/2的图像,这样如果两帧图像内容有变化,就会出现撕裂。
而Vsync就是为了解决这个问题,比如一般android的Vsync信号是60HZ或者120HZ,gpu如果想要渲染,就必须等到一次vsync信号,只要gpu渲染和显示屏处理速度都大于等于vsync帧率,就可以避免撕裂且不会卡顿。

Hareware Composer

Hareware Composer 的实现以前在Hal层,最近的版本是通过aidl来访问的,他提供的功能主要是通过硬件合成以及硬件的VSync信号。在新版本的Android里它其实不是直接操作驱动节点,而是通过调用DRM提供的接口来实现的。(DRM是linux的图形显示系统,包含了各种显示相关的驱动)

Fence

fence的作用和多线程中的锁类似,只不过他是跨进程,跨设备的。我们这里生产者需要gpu来渲染,消费者拿到buffer可能需要GPU和HWC合成,所以需要跨设备。

SurfaceFlinger流程简述

Activity启动在onResume的时候会构建一个Window,构建Window相应也会调用SurfaceFlinger的binder接口构建一个Surface,SurfaceFlinger对应会构建一个layer,这个Surface是一个应用侧对窗口渲染的入口,Surface之下会有一个消费者生产者模型,而消费生产的对象是GrallocBuffer,渲染后的数据就是写在这个buffer内的。
app在需要更新UI时(一般就是有view属性改变触发了invaildate),会通过ChoreoGrapher向SurfaceFlinger请求下一帧VSync,等VSync信号来后调用onDraw绘制渲染,并且最终会通知到SurfaceFlinger。
SurfaceFlinger收到通知后,也会请求下一帧Vsync信号,下一帧Vsync来之后就会对客户端传过来的变更进行处理,计算可见区域透明区域,然后将不同应用的layer使用gpu进行一部分合成,然后会通过hwc进行最终的合成并且显示到屏幕上。

本章涉及的内容

  1. 简述
  2. SurfaceFlinger和端侧的Binder框架(创建layer)
  3. Fence介绍
  4. BlastBufferQueue
  5. vsync信号
  6. GraphicBuffer
  7. Transaction改变layer属性
  8. SufaceFlinger合成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值