Android 4.4(KitKat)中VSync信号的虚拟化

时间:2022-08-28 12:28:17

原文地址:http://blog.csdn.net/jinzhuojun/article/details/17293325

Android 4.1(Jelly Bean)引入了Vsync(Vertical Syncronization)用于渲染同步,使得App UI和SurfaceFlinger可以按硬件产生的VSync节奏来进行工作。关于VSync的介绍详见博文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信号的虚拟化

虽然大家都同步了,但新的问题产生了:

1. App UI和SurfaceFlinger的工作显然是一个流水线的模型。即对于一帧内容,先等App UI画完了,SurfaceFlinger再出场对其进行合并渲染后放入framebuffer,最后整到屏幕上。而现有的VSync模型是让大家一起开始干活。这样对于同一帧内容,第一个VSync信号时App UI的数据开始准备,第二个VSync信号时SurfaceFlinger工作,第三个VSync信号时用户看到内容,这样就两个VSync period(每个16ms)过去了。这会影响用户体验。

2.计算机资源是有限的,大家一起做事,都抢资源,必然导致工作加倍的慢。

Android 4.4(KitKat)引入了VSync的虚拟化,即把硬件的VSync信号先同步到一个本地VSync模型中,再从中一分为二,引出两条VSync时间与之有固定偏移的线程。示意图如下:

Android 4.4(KitKat)中VSync信号的虚拟化

这样,大家工作既保持一定的节拍,又可以相互错开,一前一后保持着咚次哒次,咚次哒次的流水节奏了:) 注意其中两个Phase offset参数(即VSYNC_EVENT_PHASE_OFFSET_NS和SF_VSYNC_EVENT_PHASE_OFFSET_NS)是可调的。

相关的主要创建流程在DispSync::DispSync():

292DispSync::DispSync() {
293 mThread = new DispSyncThread();
294 mThread->run("DispSync", PRIORITY_URGENT_DISPLAY + PRIORITY_MORE_FAVORABLE);

以及SurfaceFlinger::init()中:

604    sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
605 vsyncPhaseOffsetNs, true);
606 mEventThread = new EventThread(vsyncSrc);
607 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
608 sfVsyncPhaseOffsetNs, false);
609 mSFEventThread = new EventThread(sfVsyncSrc);
610 mEventQueue.setEventThread(mSFEventThread);
611
612 mEventControlThread = new EventControlThread(this);
613 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);

相关的类图如下:

Android 4.4(KitKat)中VSync信号的虚拟化

如果上图不怎么直观的话,下面这张用序列图表示的线程模型图应该更好理解一点:

Android 4.4(KitKat)中VSync信号的虚拟化

类型DispSync表示了一个基于硬件VSync信号的同步模型,它会根据从HWComposer来的硬件VSync信号的采样来进行同步。其它两个EventThread分别用了两个不同的虚拟VSync信号源(用DispSyncSource表示,其中包含了与真实VSync信号的偏移值),这两个VSync信号源就是被虚拟出来分别用于控制App UI和SurfaceFlinger渲染的。在EventThread的线程循环中,如果有需要就会向DispSync注册相应的listener。DispSyncThread就像乐队鼓手一样控制着大家的节奏。它在主循环中会先通过已经向DispSync注册的listener计算下一个要产生的虚拟VSync信号还要多久,等待相应时间后就会调用相应listener的callback函数。这样,对于那些注册了listener的监听者来说,就好像被真实的VSync信号控制着一样。至于EventControlThread是用来向真实的VSync硬件发命令的,可以先不管。

看来谷歌对于大家对Android UI流畅性的吐槽也已经很郁闷了,才会把VSync整这么麻烦。不过这样做缺点是引入了需要tune的参数,如果设不好结果可能也好不到哪去,将来会不会通过一些统计手段来让这两个参数自适应呢?

Android 4.4(KitKat)中VSync信号的虚拟化的更多相关文章

  1. Android 4&period;4&lpar;KitKat&rpar;中apk包的安装过程

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/25542011 事实上对于apk包的安装.4.4和之前版本号没大的区别. Android中a ...

  2. Android 5&period;0&lpar;Lollipop&rpar;中的SurfaceTexture,TextureView&comma; SurfaceView和GLSurfaceView

    SurfaceView, GLSurfaceView, SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类.本文基于Android 5.0(L ...

  3. vsync信号产生与分发

    以下分析基于android 4.4代码 vsync信号的产生.分发涉及到以下几个类,先主要了解下他们各自的功能: HWComposer:产生hardware vsync,post fb VSyncTh ...

  4. Android 4&period;4 KitKat 新特性

    New in Android 4.4 KitKat 本文是一个概览,关于KitKat,也即Android4.4的新东西,先是功能型的,之后是设计上的. 很多特性本文并没有提到,很多提到的特性也只是简短 ...

  5. 让你的短信应用迎接Android 4&period;4&lpar;KitKat&rpar;

    原文地址:Getting Your SMS Apps Ready for KitKat 发送和接收短信是手机最基本的功能,很多的开发者也开发了很多成功的应用来增强Android这一方面的体验.你们当中 ...

  6. Android 4&period;4 Kitkat Phone工作流程浅析&lpar;六&rpar;&lowbar;&lowbar;InCallActivity显示更新流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

  7. GetPathFromUri4kitkat【Android 4&period;4 kitkat以上及以下根据uri获取路径的方法】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在Android4.4之前和之后,通过Intent调用文件管理器选择文件,获取的文件uri地址形式是不同的. Android6.0 ...

  8. Android 4&period;4 Kitkat Phone工作流程浅析&lpar;八&rpar;&lowbar;&lowbar;Phone状态分析

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象.与Google原生AOSP有些许差异.请读者知悉. ...

  9. Android 4&period;4 KitKat终于支持录屏&lpar;Screen Recording&rpar;了!

    本文介绍了Android 4.4 KitKat系统新增加的录屏功能以及录屏方法,和限制因素.如果App由于版权方面的原因,不想被记录屏幕录像的话,APP只需要在相应的SurfaceView请求“Sur ...

随机推荐

  1. Install nutch

    1. Install nutch on single node: $apt-get install subversion $apt-get install ant $svn co https://sv ...

  2. php 代码大全

    1.子类访问父类静态方法 <?php class A{ static function loadById(){ $class_name = get_called_class(); $model ...

  3. C&sol;C&plus;&plus;中的常成员函数

    代码: #include <iostream> using namespace std; class A{ public: void func1(){ cout<<" ...

  4. 2017计算机学科夏令营上机考试-A判决素数个数

    A:判决素数个数 总时间限制:  1000ms 内存限制:  65536kB 描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y). 输入 两个整数X和Y(1 <= X,Y <= ...

  5. kettle 分组

    kettle 分组组可以实现group_concat的效果

  6. linux应用之test命令详细解析

    test命令用法. 功能:检查文件和比较值 1)判断表达式 if test  (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2                  两个表 ...

  7. 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  8. 快速创建IIS站点并设置权限

     net user WebSiteUser WebSiteUserWebSiteUser /add /yWMIC Path Win32_UserAccount Where Name="Web ...

  9. 同步手绘板——关于&sol;dev&sol;graphics&sol;fb0权限的获取

    需要先将手机进行root,接着通过代码将/dev/graphics/fb0文件修改为可读的权限

  10. kbmmw 中JSON 操作入门

    现在各种系统中JSON 用的越来越多.delphi 也自身支持JSON 处理. 今天简要说一下kbmmw 内部如何使用和操作JSON. kbmmw 中json的操作是以TkbmMWJSONStream ...