5. Vsync机制
5.1 黄油计划_三个方法改进显示系统
vsync, triple buffering, vsync虚拟化

参考文档:
林学森 <深入理解Android内核设计思想>第2版 9.6节

Getting To Know Android 4.1, Part 3: Project Butter - How It Works And What It Added
http://www.androidpolice.com/2012/07/12/getting-to-know-android-4-1-part-3-project-butter-how-it-works-and-what-it-added/

Android 4.4(KitKat)中VSync信号的虚拟化
http://blog.csdn.net/jinzhuojun/article/details/17293325

Vsync:

图中的16ms表示显示一副图片的时间,display表示第几帧,图中display显示第0帧的时候,GPU或者CPU准备第1帧显示的图片,在第0帧尾部,CPU或者GPU本应该开始准备第2帧显示的图片,结果他们偷懒了,没有被强制在Vsync处开始工作,因此Display只能连续两帧显示一副图片 ,称这种现象为Jank

假如cpu或者gpu掉链子了怎么办,如下图,如果GPU忙不过来了,没有能及时完成,又会导致Jank,引入了 triple buffering

上述优化是在Vsync时刻才开始工作,而APP准备好数据是发送给surface,surface使用CPU和GPU进行渲染生成图片,然后发给display,如果都同时工作,那么一副图片显示需要经过两个Vsync时刻32ms,先是APP生成,接着surface处理,然后才能显示,问题的根源是都在Vsync时刻开始工作,错过了就要等到下个Vsync,解决办法是让surface在APP就绪好后就开始工作,因此把App开始工作的时候是Vsync+offset1,surface工作的时刻在Vsync+offset1+offset2

5.2 Vsync框架

(1)谁产生Vsync:硬件或者软件(VsyncThread)

(2)谁处理Vsync:某个线程(DispSyncThread)

(3)Vsync分为Vsync-APP和Vsync-Surface,谁负责Vsync虚拟化(DispSyncThread)

(4)Vsync-App和Vsync-Surface怎么起作用:按需产生:APP需要更新界面的时候,发送请求Vsync信号给EventThread(APP),EventThread(APP)在收到Vsync后唤醒APP,APP开始产生新界面

                        Surface需要合成界面的时候,发送请求Vsync信号给EventThread(Surface),EventThread(Surface)在收到Vsync后唤醒Surface,Surface开始合成新界面

由上图可知Vsync框架引入了五个线程:软件产生Vsync信号的线程、虚拟化Vsync信号产生Vsync-APP和Vsync-Surface的线程、分别对Vsync-APP和Vsync-Surface感兴趣的EventThread(APP)和EventThread(Surface)、SurfaceFlinger线程

当应用程序需要更新它的界面的时候对EventThread(APP)发出请求,请求得到Vsync-APP信号,APP得到Vsync-APP信号后,APP开始构造画面,完成后把这些画面发送的SurfaceFlinger线程,SurfaceFlinger收到画面后其向EventThread(Surface)发出请求,请求得到Vsync-Surface信号,SurfaceFlinger得到Vsync-Surface信号后,SurfaceFlinger开始合成画面

APP按需进行:

(1)APP有更新界面的需要时,它需要得到Vsync-APP

(2)APP向EventThread(APP)提出请求

(3)EventThread(APP)再向DispSyncThread提出请求

(4)DispSyncThread收到Vsync后,休眠offset1,发出Vysnc-APP

Surface按需进行:

(1)APP把新数据发给Surface

(2)Surface有Vsync需求,向EventThread(surface)发出请求

(3)EventThread(Surface)再向DispSyncThread发出请求

(4)DispSyncThread收到Vsync后,休眠offset2,发出Vysnc-Surface

5.3 初始化代码分析

上述所说的Vsync框架中的五个线程同属于SurfaceFlinger进程,在Main_surfaceflinger.cpp函数中创建,SurfaceFlinger是主线程

5.4 surfaceflinger使用vsync过程代码分析

(1)APP发数据给surfaceflinger

(2)surfaceflinger发请求给EventThread(surface)

(3)EventThread(surface)发vsync请求给DispSyncThread

(4)硬件或者软件Vsync会唤醒DispSyncThread

(5)DispSyncThread发信号给EventThread(surface),其在发信号给surfaceflinger

11.5 Android显示系统框架_Vsync机制_黄油计划_三个方法改进显示系统的更多相关文章

  1. 11.5 Android显示系统框架_Vsync机制_代码分析

    5.5 surfaceflinger对vsync的处理buffer状态图画得不错:http://ju.outofmemory.cn/entry/146313 android设备可能连有多个显示器,AP ...

  2. win10系统U盘读取不了怎么解决 三种方法快速解决&quot;文件或目录损坏且无法读取& 发布时间:2020-06-05 09:19:46 作者:佚名 我要评论

    win10系统U盘读取不了怎么解决 三种方法快速解决"文件或目录损坏且无法读取&   发布时间:2020-06-05 09:19:46   作者:佚名    我要评论 win10电脑 ...

  3. $Android去除系统默认的标题栏和全屏的三种方法

    在做应用的时候,很多时候是不需要系统自带的标题栏的,而是自己去实现标题栏,这就要去掉系统的标题栏,下面总结了三种方法.全屏也是一样的道理,也总结了实现的三种方法. (一)去除标题栏 1.方法1 在Ac ...

  4. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  5. android系统通过图片绝对路径获取URI的三种方法

    最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在 android 4.1.3的系统上都是可用的. 1.将所有的图片路径取出,遍历比较找到需要的路径 ...

  6. Android 显示系统:Vsync机制

    一.Vsync简介: 屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),从上到下(屏幕刷新,垂直刷新,Vertical Scanning).当整个屏幕刷新完毕 ...

  7. 11.1 Android显示系统框架_framebuffer原理及改进

    1. Android显示系统框架Android Graphic UI with GPU Hardware Accelerationhttps://community.nxp.com/docs/DOC- ...

  8. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  9. Android系统--输入系统(五)输入系统框架

    Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...

随机推荐

  1. 获取cpu使用率

    http://blog.csdn.net/u010515761/article/details/43225621 http://stackoverflow.com/questions/74674/ho ...

  2. jvm vmthread

    http://www.360doc.com/content/15/0615/16/15758456_478311946.shtml http://www.51testing.com/html/95/1 ...

  3. 从零開始的Android新项目7 - Data Binding入门篇

    Data Binding自从去年的Google I/O公布到至今,也有近一年的时间了.这一年来,从Beta到如今比較完好的版本号.从Android Studio 1.3到如今2.1.2的支持,能够说D ...

  4. OpenStack_Swift源代码分析——Object-auditor源代码分析(2)

    1 Object-aduitor审计详细分析 上一篇文章中,解说了Object-aduitor的启动,当中审计的详细运行是AuditorWorker实现的.在run_audit中实例化了Auditor ...

  5. SPSS提示“列表中不同意存在字符串变量”的解决方法

    今天用SPSS对一些数据进行主成分分析,SPSS 19.0进行主成分分析的方法是:分析--降维--因子分析,可是当导入一些变量的时候.就会弹出窗体说"列表中不同意存在字符串变量", ...

  6. vim基础学习之搜索功能

    当我们使用vim看源码的时候,我们可能会碰到一个方法或者变量,我们想要知道这个变量在其他地方的使用情况.这时候我们经常的做法就是退出当前的文件,或者是重新切换一个终端,然后使用grep或者find等s ...

  7. 三个角度解构云计算,商业驱动or技术驱动?

    从云计算的使用者到云服务的输出者,大多互联网公司在过去一年完成了角色的转换,也让云计算的未来更加扑朔迷离.不过,抛却进入时间这个评判因素,单从技术和商业化的角度来解构云计算的话,对于云计算的格局以及未 ...

  8. iOS-APP-Icon 图标启动图及名字的设置

    本文讲下appIcon图标.启动图及名字的设置 icon for iOS 图标大小参照苹果官网:https://developer.apple.com/library/ios/qa/qa1686/_i ...

  9. windows删除多余启动引导项

    方法1: 按快捷键win+r,打开运行界面,输入msconfig. 点击确定,进入系统配置,选择引导选项卡,如图: 选中你不需要的启动项,点击下面的删除按钮即可.删除完成之后点击确定,重启计算机就可以 ...

  10. C++里面virtual函数及虚表大小

    实验了下面的函数: #include <vector> #include <iostream> using namespace std; class A { public: v ...