深入剖析android新特性 笔记

9.3 Project Butter 黄油计划

Android4.1 Jelly Bean引入了ProjectButter

先说背景,再讲解为什么ProjectButter能提升流畅性

用户感受到流畅性在于自己的输入事件与返回结果之间的延迟,若事件延迟短,则跟手,流畅,

这只是用户的角度看问题,系统中,从事件输入到最终结果响应,过程非常复杂:

(Activity)Event->SetPropertyValue->Invalidate->Measure&Layout->PrepareDraw ->

(SF)DequeueBuffer

(Activity)UpdateDisplayList->DrwaDisplayList->SwapBuffers ->

(SF)EnqueueBuffer,

(SF)CompositeWindows->PostBuffer

Acitivity进程内,主要是接收到事件后进程控件属性的更新,然后根据新的属性重新测量和布局,

布局完成后从SF获取一个缓冲,然后将新空间树的结构更新到这个buffer中,最后交给SF合成和显示。

下节讲SF,现在只要知道,SF是系统中专门负责绘制UI的系统服务就可以。

9.3.1 FPS

FramesPerSecond,FrameRate,Hz,

平稳的60FPS就算是流畅,但ipad pro 2017的refreshRate已经达到120Hz。

平稳是指,不可以有卡帧、掉帧的情况

1000ms / 60 = 16.67ms

每一帧必须保证在这个时间内处理完

Jank的产生:

VSync Vsync

Disp 0 | 1 | 1 | 2 | 3 |

GPU 1 | |2 |3 4 |

CPU 1 | 2 | 3 | 4 |

CPU负责测试和布局的计算

GPU负责图像的合成

Display是最终的显示模块,代表用户看到的结果

所有界面的刷新都要经历这三个模块的流水线作业,

流程:

开始没画面,disp0,

CPU产出1st帧的内容,然后交给GPU,接着在Disp上显示

假设CPU忙其他事,没能连续产生2nd帧内容,则导致一系列延迟,第一帧画面停留了2个VSync

ProjectBuffer引入两个机制提升流程性:

1,VSYNC机制

2,Triple Buffer

9.3.2 VSYNC

Vertical Synchronization,垂直同步

用来防止Tearing撕裂,

视频、游戏由一幅幅图像组成,称为帧

每帧有很多像素点

显示器显示每一帧画面时,需要一行一行刷新到屏幕,(逐行扫描)

显示器通过GPU的Buffer拿到要显示的每一帧数据,

假设显示器将当前帧内容刷新到一半时,来了新的一帧数据,两帧内容一起显示,Tearing。

VSYNC的目的就是避免这种情况,它告知GPU等到屏幕内容刷新完再加载下一帧画面内容,避免了Tearing

Android之前的版本已经使用VSYNC避免Tearing,jellyBean对VSYNC进行了加强,

所有显示组件都以VSYNC信号为基准来保证步调一致,

CPU收到VSYNC,产生帧数据

交给GPU处理

display出来

9.3.3 Choreographer与VSYNC

编舞者

Choreographer是伴随ProjectButter新增的API,

负责统一动画、输入、绘画的时机。

负责接受VSYNC信号然后安排下一帧所需的相关工作

开发者可以通过Choreographer.postFrameCallback(FrameCallback c)API来提交一个回调,这个回调会在下一帧时刻执行。

每个Looper线程都有自己的Choreographer,

其他线程可以发布回调,以在Choreographer运行,但他们将在Choreographer所属的Looper上运行。

这个有结构图,分java层,C++层,

图的结构说明:

Choreographer提供FrameCallback,来让开发者实现帧渲染监听的回调,Choreographer负责调度这些回调,

<<interface>> <---------- android.view.Choreographer

FrameCallback +getInstance():Choreographer

+doFrame() : void +scheduleVsyncLocked() : void

+doFrame() : void

+doCallbacks() : void

//依赖关系,Choreographer只有传入了FrameCallback才有用

FrameDisplayEventReceiver是DisplayEventReceiver的子类;

android.view.DisplayEventReceiver <------ FrameDisplayEventReceiver

+nativeScheduleVsync() +scheduleVsync()

+scheduleVsync()

+onVsync()

+onHotplug()

-dispatchVsync()

-dispatchHotplug()

//+是public,-是private

FrameDisplayEventReceiver与android.view.Choreographer是聚合关系,强调整体包含部分,

Choreographer包含FrameDisplayEventReciver

以上是JAVA层

DisplayEventReceiver通过JNI与native端的NativeDsiplayEventReceiver连通,

NativeDisplayEventReceiver是DisplayEventDispatcher的子类;

DisplayEventDispatcher <------- NativeDsiaplyEventReceiver

-handleEvent() +scheduleVsync

+processPrendingEvents() -dispatchVsync()

-dispatchVsync() -dispatchHotplug()

-dispatchHotplug()

+scheduleVsync()

DisplayEventDispatcher包含了一个DisplayeventReceiver对象

DisplayEventReceiver

+requestNextVsnc()

+getEvents()

+getFd()

DisplayEventReceiver包含IDisplayEventConnection与BitTube

IDisplayEventConnection

+getDataChannel() : BitTube

+setVsyncRate(count:int) : void

+requestNextVsync() : void

BitTube

+recvObjects()

+sendObjects()

+getFd():int

DisplayEventReceiver可以获取到显示时间的接收器,包含了VSYNC事件,

所以,VSYNC事件传递流程:

BitTube => DisplayEventReceiver => DisplayEventDispatcher =>

NativeDisplayEventRevicer => DisplayEventReceiver =>

FrameDisplayEventReceiver => Choreographer

VSYNC事件的接收

上图还有IDisplayEventConnection和BitTube类没介绍,他们与接收VSYNC事件密切相关,详细看下

DisplayEventReceiver包含了IDisplayEventConnction与BitTube两个类型的指针:

//DisplayEventReceiver.h

sp<IDisplayEventConnection> mEventConnection;

std::unique_ptr<gui :: BitTube> mDataChannel;

并在DisplayEventReceiver构造函数中对他们初始化,

//DisplayEventReceiver.cpp

DisplayEventReceiver::DisplayEventReceiver(ISurfaceComposer::VsyncSource vsyncSource){

sp<ISurfaceComposer> sf(ComposerService::getComposerService());

if(sf != NULL) {

mEventConnection = sf -> createDisplayEventConnnection(vsyncSource);

if(mEventConnnection != NULL){

mDataChannel = std::make_unique<gui::BitTube>();

mEventConnection->stealReceiveChannel(mDataChannel.get());

}

}

}

ISurfaceComposer在下一节讲,这里只要知道,通过sf->createDisplayEventConnection变获取到了SurfaceFlinger的连接就可以了。

Tube是通道,BitTube就是传输bit数据的通道,

VSYNC事件就是通过这个通道从SF传递到位于AP进程的DisplayEventReceiver中的,

数据传递的方法是通过BitTube的sendObject和recvObjects两个静态方法:

......

9.3.4 TripleBuffer

Android Project Butter 黄油计划相关推荐

  1. 用力一瞥Android渲染机制-黄油计划

    一. 渲染基本概念 对于渲染来说在开始前我们先了解几个概念: CPU主要负责包括 Measure,Layout,Record,Execute 的计算操作. GPU主要负责 Rasterization( ...

  2. Android 之 Project Butter 详细介绍

    现在我们已经很少能够听到关于 Android UI 卡顿的话题了,这得益于 Google 长期以来对 Android 渲染性能的重视,基本每次 Google I/O 都会花很多篇幅讲这一块.随着时间的 ...

  3. create maven android project

    2019独角兽企业重金招聘Python工程师标准>>> Getting Started The Android Configurator is an Maven Integratio ...

  4. Eclipse New菜单中没有Android Project选项

    1.file -->new -->other -->android文件夹 --> 双击android project. 2.经常用的话自己定义 在工具栏上找到Window 选择 ...

  5. Error:The module 'app' is an Android project without build variants, and cannot be built.

    导入 项目 Error:The module 'app' is an Android project without build variants, and cannot be built. Plea ...

  6. Eclipse导入Android Project遇到的问题

    2019独角兽企业重金招聘Python工程师标准>>> Eclipse导入Android Project提示错误"Overlaps The Location Of Anot ...

  7. Treasure Project(藏宝计划)冲刺百倍!

    ​​Treasure Project(藏宝计划)是什么? Treasure Project是一种全新的基于区块链技术,服务于Web3.0的金融协议,它使质押变得更快捷.更高效,参与者在获得丰厚回报的同 ...

  8. 加密市场熊市最后的曙光——Treasure Project(藏宝计划)

    ​​首先我们说一下当下市场的环境,目前处在一个熊市的环境下. 时势造英雄: 为什么当下的环境适合玩项目? 熊市的资金流向会从二级市场转向资本市场. 举个例子: 上个熊市的初期的创世大盘,如Plus T ...

  9. Project Babel通天塔计划亮相2022全球元宇宙大会

    2022年8月18-19日,由中国移动通信联合会主办.上海市通信管理局联合主办.众视Tech.中移联会展部.元宇宙产业委承办.BIC EURONOVA(欧盟创新中心)和GSMA 5G IN 作为国际合 ...

最新文章

  1. 对于STM32F103三轴机械臂控制器进行基本功能测试-上下运动功能
  2. 鼠标绘图 c语言,c语言高级编程技术教程 图形显示方式与鼠标输入.doc
  3. sqlite3 c语言编程,SQLite教程(十三):C语言编程实例代码(1)
  4. KMP(字符串匹配)算法 O(m+n)
  5. 常见的网络工程师面试问题
  6. CCNA第五章WAN连接
  7. Linux内核分析 02
  8. JAVA学习笔记001---认识了解NIO
  9. printf格式控制符的完整格式
  10. Unity-lambda表达式
  11. 在EntityFramework中使用 nock的方法。
  12. spring boot结合shiro实现用户-角色-权限的控制(包含用户名密码登陆和手机号验证码登陆)
  13. 又要数数小绵羊(四刷) kkmd66
  14. Python练习:四叶玫瑰数求解
  15. 计算机开机慢怎么办,电脑开机速度慢怎么办?电脑开机慢五大处理方法介绍
  16. 亚马逊 Sessions 与 Pageviews 有什么区别?
  17. 问卷星复制内容方法(利用官方功能导出为word格式)
  18. 外派公司或者外包公司,真的适合选择吗?
  19. linux 【CPU性能】 系统中的软中断使用率升高怎么办?
  20. iOS 按锁屏后重新打开APP直接退到后台问题

热门文章

  1. 非主流闪图头像教程:动感头像效果
  2. 利用公有云cvm 公网IP实现内网穿透,远程登录内网服务器
  3. SAS系统从入门到放弃?不能放弃,它是数据科学家必备技能
  4. 西安工程大学c语言试卷,C语言程序设计(西安工程大学)2020知到章节测试题答案...
  5. linux拷贝文件断电后丢失,linux突然断电重启,配置文件丢失/程序无法打开/文件损坏...
  6. 站长平台之360推送工具
  7. 2021-2027全球及中国G Suite销售软件行业研究及十四五规划分析报告
  8. 与微信公众平台的商榷
  9. Python中end=‘ ‘的用法
  10. node.js入门_Node.js入门