zoukankan      html  css  js  c++  java
  • 11.5 Android显示系统框架_Vsync机制_黄油计划_三个方法改进显示系统

    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

  • 相关阅读:
    mysql生成随机时间
    使用JEECG心得
    嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
    svn 的使用(二)
    Java的几个有用小Util函数(日期处理和http)
    设置UITableViewCell高度的问题
    初探排序学习笔记
    从串口设置、读取、并分析um220模块的数据
    NYOJ-47 过河问题
    Lock_sga 和 pre_page_sga 参数详解
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/9196187.html
Copyright © 2011-2022 走看看