Vsync垂直同步信号分发和SurfaceFlinger响应执行渲染流程分析(一)
来源:互联网 发布:python windows 路径 编辑:程序博客网 时间:2024/05/15 05:55
之前有一篇博客已经讲过一点Android应用程序和SurfaceFlinger建立连接,获取一个binder本地代理对象的过程,有了这个本地代理对象,应用程序就可以使用它调用SurfaceFlinger的UI合成、渲染功能了,可参考:Android Application与SurfaceFlinger连接过程分析,讲的很粗糙,但是我们可以看到一个大致过程,就是在WindowManagerService为每个Activity执行添加窗口addView方法时,创建好了WindowState对象,然后会调用win.attch()方法,和SurfaceFlinger取得连接也就是这个时候建立的。如果大家还想了解更细的话,可以参考老罗的博客:Android应用程序与SurfaceFlinger服务的连接过程分析,这里讲的非常详细。
关于UI合成渲染这块的知识,用到的东西太多了,我也是平时看看书,查查百度,想尽量搞清楚一些,但是目前为止,还是只能了解的部分,无法从全面掌握,也是为了怕自己忘记,所以将自己学习到的总结出来,方便随时查阅,如果能给大家带来帮助,那就更好了。
好了,我们进入正题,话说Android在4.1版本之前,UI界面方面存在很大的一个问题,就是经常会出现界面错乱,Google官方叫Jank,我们来看看下面这幅图:
从图上我们就很明显可以看出来问题产生的原因了,就是我们的CPU、GPU、Display三个器件需要进行配合对所有的UI进行合成、渲染、显示,但是之前的版本当中,没有一个统一的命令,导致CPU不知道何时开始执行合成,于是推迟了时间,后边的渲染和显示自然也就耽误了,那么就会出现数字1的画面显示了两帧,还有可能出现,数字1的一部分和数字2的一部分显示在同一界面上了,Google为了解决这个问题,所以加入了Vsync垂直同步信息,我们来看看加入了Vsync垂直同步信息后的情况:
从加入了垂直同步信号后的情况明显可以看出来,情况好了很多,由信号产生模块发出信号,只要信号发出,CPU马上进行合成,完成后交给GPU渲染,最后由Display进行显示,这样的话,就能很好的保证我们的界面显示问题了,当然,任何软件措施都无法保证100%的解决问题,但是从现在实际场景来看效果,确实还是非常满意的。
现在呢,我们就来了解一下Vsync垂直同步信号。从上面的逻辑图当中,应该也很容易看出来,我们需要的是什么呢?就是一个信号产生器就OK了,由它产生信号,指挥CPU、GPU、Display三者对UI进行同步的合成,这样就够了,那么Google在提供这个功能的时候,提供了两种方式:一种是由硬件产生,一种是由软件产生。接下来我们就来看一下Vsync的生产过程,产生的代码在HWComposer.cpp当中,composer的英文意思就是设计者,看着这个名字都让我们非常清晰它的作用,这也是细节之处,高手写出来的代码,处处都是亮点,小到一个变量、一个方法的修饰词,大到一个类、项目框架,里边有很多值得我们学习的地方。下面我们来看一下这块的代码:
首先调用property_get获取系统属性,然后加载硬件模块loadHwcModule,mHwc变量的意思就很明显了,就是当前是否有硬件模块支持,如果有,那么needVSyncThread就赋值为false,表示Vsync信号由硬件产生,不需要软件模拟,否则的话,就需要由软件来产生了。那么如果需要由软件产生的话,就启动一个VSyncThread来执行这个功能。这个方法的意思也非常清晰,就是要确定好Vsync信号的产生源,到底这个事情由硬件来作,还是由软件来作。当然中间还包括一些初始化、设备加载等的逻辑。
下面我们就分硬件产生和软件产生两个方面来分析一下后续流程:
一、Vsync由硬件产生
如果Vsync信号由硬件产生,那么我们在执行初始化的时候,需要注册硬件回调,也就是我们上面代码当中mHwc->registerProcs(mHwc, &mCBContext->procs)这句的作用,mHwc为true,mCBContext是HWComposer的私有类变量,是一个cb_context*指针,它的定义也在HWComposer.cpp当中,代码如下:
这里就是将产生的事件直接传递给mEventHandler,传递什么呢?其实就是一个时间点,我们回头看一下,解决Jank的方案就是要确定好Vsync信号产生的时间点,所以呢,这里由硬件确定好时间点,然后通知各个模块,当然,大家肯定都以系统时间为基点了,这样才能保证统一。我们来看一下mEventHandler是谁创建的。这就联系到SurfaceFlinger的初始化过程了,HWComposer就是在那里创建的,代码如下:
- Vsync垂直同步信号分发和SurfaceFlinger响应执行渲染流程分析(一)
- Vsync垂直同步信号分发和SurfaceFlinger响应执行渲染流程分析(二)
- Android SurfaceFlinger VSync流程分析
- Android SurfaceFlinger对VSync信号的处理过程分析
- 垂直同步(VSYNC)实现原理
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- VSync Count 垂直同步
- unity的垂直同步VSync
- 24. Swap Nodes in Pairs
- 详谈接口和抽象类
- Java中的相对路径解惑
- apache commons collections CollectionUtils工具类简单使用
- Android应用打开第三方软件
- Vsync垂直同步信号分发和SurfaceFlinger响应执行渲染流程分析(一)
- Contiki的一个demo例程
- 开博客了,和同学们一起讨论OI问题
- HDU 2487 Ugly Windows By Assassin
- 自组织神经网络SOM原理——结合例子MATLAB实现
- Matlab基础之基本数值运算
- AHandler机制
- Jlink V8固件修复
- Java面试必看二十问题