GUI系统之SurfaceFlinger(9)Project Butter黄油计划

本文详细探讨了Android GUI系统中的SurfaceFlinger,尤其是Project Butter(黄油计划),该计划旨在提升UI流畅性。文章分析了VSync、Triple Buffering在减少screen tearing和Jank现象中的作用,解释了为何引入第三个缓冲区以提高显示效率。

文章都是通过阅读源码分析出来的,还在不断完善与改进中,其中难免有些地方理解得不对,欢迎大家批评指正。
转载请注明:From LXS. http://blog.youkuaiyun.com/uiop78uiop78/

GUI系统之SurfaceFlinger章节目录:
blog.youkuaiyun.com/uiop78uiop78/article/details/8954508





1.1 SurfaceFlinger

从这一小节开始,我们正式切入SurfaceFlinger的分析。为了保持讲解的连贯性,部分内容可能在前面的章节中已经有所涉及了,接下来将会对其中的细节做更多的扩展讲解。

内容组织如下:

l  首先介绍Android 4.1引入的新特性(Project Butter),理解这个项目是必要的,可以说SurfaceFlinger有很大一部分的内容就是围绕它来的

l  SurfaceFlinger的启动过程及工作方式

l  SurfaceFlinger与BufferQueue及应用程序间的关系

l  SurfaceFlinger对VSYNC信号的处理过程(重点)

1.1.1 ProjectButter

直译过来,就是“黄油计划”,为什么叫这个名字呢?这个Project的目的是为了改善用户抱怨最多的Android几大缺陷之一,即UI响应速度——Google希望这一新计划可以让Android系统摆脱UI交互上给人带来的“滞后”感,而能像黄油一般“顺滑”。Google在2012年的I/O大会上宣布了这一计划,并在Android 4.1中正式搭载了实现机制。

Butter中有两个重要的组成部分,即VSync和Triple Buffering。下面先分别介绍引入它们的原因。

喜欢玩游戏或者看电影的读者可能遇到过这样的情形:

Ø  某些游戏场面好像是几个场景“拼凑”而成的

Ø  电影画面不连贯,好像被“割裂”了

这样子描述有点抽象,我们引用widipedia上的一张图来看下实际的效果:


图 11‑20 Screen Tearing实例

引自http://en.wikipedia.org/wiki/File

### 黄油计划 #### 介绍 黄油计划Project Butter)是谷歌在Android 4.1版本引入的一项优化计划,旨在显著提升Android系统的流畅度和响应速度,解决此前版本中存在的卡顿问题,为用户带来更加顺滑的操作体验。 #### 原理 - **VSync同步机制**:引入垂直同步(VSync)技术,使得屏幕刷新和应用绘制操作同步进行。在传统方式下,刷新和绘制可能不同步,导致画面撕裂或卡顿。VSync让系统按照屏幕的刷新频率(如60Hz)来进行绘制,确保每次刷新时都有完整的新画面。 - **三重缓冲**:在原有的双缓冲基础上增加一个缓冲区。双缓冲在某些情况下可能因为绘制和刷新的速度不匹配而导致卡顿,三重缓冲提供了额外的缓冲空间,减少等待时间,让绘制和刷新过程更加流畅。 - **Choreographer**:负责协调动画、输入和绘制的时间安排。它会接收VSync信号,并根据信号来调度各个操作,保证它们在合适的时机执行,避免操作之间的冲突和延迟。 #### 应用 黄油计划广泛应用于各Android设备中,从手机到平板电脑等。优化后的系统在日常操作,如滑动屏幕、打开应用、切换任务等方面都有明显的流畅度提升,提升了用户对Android系统的使用体验和满意度。 ### SurfaceFlinger #### 介绍 SurfaceFlinger是Android系统中的一个关键服务,主要负责管理和合成图形层。它接收来自不同应用和系统组件的图形数据,将这些数据进行处理和合成,最终输出到显示设备上。 #### 原理 - **图形层管理**:SurfaceFlinger维护一个图形层的列表,每个应用或系统组件的图形输出都会被抽象为一个或多个图形层。这些层有不同的属性,如位置、大小、透明度等。 - **合成过程**:它会根据图形层的属性,将各个层进行合成。合成方式包括硬件合成和软件合成。硬件合成利用GPU(图形处理器)的强大计算能力,快速地将多个层合并为一个完整的画面,效率高;软件合成则在CPU上进行,适用于一些简单或特殊情况。 - **显示输出**:合成后的画面会被发送到显示设备(如屏幕)上进行显示。SurfaceFlinger会与显示驱动进行交互,确保画面正确地显示在屏幕上。 #### 应用 - **多窗口显示**:在多窗口模式下,SurfaceFlinger负责将不同窗口的图形层进行合成,让用户可以同时看到多个应用的界面。 - **系统界面显示**:如状态栏、导航栏等系统界面元素的显示,也是由SurfaceFlinger进行管理和合成的。 - **游戏和视频播放**:在游戏和视频播放过程中,SurfaceFlinger将游戏画面和视频帧进行合成,确保流畅的视觉体验。 ```java // 简单示例展示如何在Android中获取SurfaceFlinger服务(伪代码) import android.os.ServiceManager; import android.view.ISurfaceComposer; // 获取SurfaceFlinger服务 ISurfaceComposer surfaceComposer = ISurfaceComposer.Stub.asInterface(ServiceManager.getService("SurfaceFlinger")); ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值