一、Vsync简介:

屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),从上到下(屏幕刷新,垂直刷新,Vertical Scanning)。当整个屏幕刷新完毕,即一个垂直刷新周期完成,会有短暂的空白期,此时发出 VSync 信号。所以,VSync 中的 V 指的是垂直刷新中的垂直-Vertical。

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,VSync是Vertical Synchronization(垂直同步)的缩写,是一种在PC上很早就广泛使用的技术,可以简单的把它认为是一种定时中断。而在Android 4.1(JB)中已经开始引入VSync机制,用来同步渲染,让AppUI和SurfaceFlinger可以按硬件产生的VSync节奏进行工作。

二、黄油计划:三个方法改进显示系统

1.Vsync同步:

可见vsync信号没有提醒CPU/GPU工作的情况下,第二次vsync到来需要显示内容时,CPU和GPU还没有来得及准备好下一帧的数据,所以只能接着显示上一帧的数据,产生Jank!

CPU/GPU接收vsync信号提前准备下一帧要显示的内容,所以能够及时准备好每一帧的数据,保证画面的流程。

2.多级缓冲:

除了Vsync的机制,Android还使用了多级缓冲的手段以优化UI流程度,例如双缓冲(A+B),在显示buffer A的数据时,CPU/GPU就开始在buffer B中准备下一帧数据:

但是不能保证每一帧CPU、GPU都运行状态良好,可能由于资源抢占等性能问题导致某一帧GPU掉链子,vsync信号到来时buffer B的数据还没准备好,而此时Display又在显示buffer A的数据,导致后面CPU/GPU没有新的buffer着手准备数据,空白时间无事可做,后面Jank频出:

因此用三级缓冲来提高系统对性能波动的容忍度:

虽然GPU在准备buffer B的数据耗时过长,第二帧Jank,但是新增1个buffer可以减少CPU和GPU在vsync同步间的空白间隙,此时CPU/GPU能够利用buffer C继续工作,所以后面就不会再产生Jank了,当然具体使用多少个buffer要根据实际硬件性能情况调整,最终目的就是解决Display的Jank产生。

3.Vsync虚拟化(Vsync App + Vsync SurfaceFlinger):

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

解决思路:SurfaceFlinger在App UI准备好数据后及时开工做合成。

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

这样,大家工作既保持一定的节拍,又可以相互错开,一前一后保持着流水节奏。

注意其中两个Phase offset参数(即VSYNC_EVENT_PHASE_OFFSET_NS和SF_VSYNC_EVENT_PHASE_OFFSET_NS)是可调的。

处理流程:

类型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硬件发命令。

三、Vsync框架

1.硬件或者软件创建vsyncThread产生vsync。

2.DispSyncThread处理vsync,把vsync虚拟化成vsync-app和vsync-sf。

3.vsync-app/sf按需产生(如果App和SurfaceFlinger都没有更新请求,则休眠省电):

APP端:APP需要更新界面时发出vsync请求给EventThread(设置connection.count>=0),DispSyncThread收到vsync信号后休眠offset,然后唤醒EventThread通知APP开始渲染。

SF端:sf请求EventThread-sf,EventThread-sf收到vsync后通知SF可以开始合成。

(vsync框架图)

(Vsync时序图)

原文:https://www.cnblogs.com/blogs-of-lxl/p/11443693.html

android vsync,Android 显示系统:Vsync机制相关推荐

  1. android surfaceflinger研究----显示系统

    这周抽空研究了一下SurfaceFlinger,发现真正复杂的并不是SurfaceFlinger本身,而是Android的display显示系统,网上关于这部分的介绍有不少,本不打算写的,但是发现还是 ...

  2. Android 9.0 显示系统导航栏(左/右/底部)

    Android 9.0 显示系统导航栏(左/右/底部) 显示系统导航栏 一般有:HOME  BACK  最近应用列表 等组成. 先看下效果图: 显示在底部(最常见的做法): 显示在右边(平板): (请 ...

  3. GUI显示系统之SurfaceFlinger

    第1章  GUI系统之SurfaceFlinger 在进入GUI系统的学习前,建议大家可以先阅读本书应用篇中的"OpenGLES"章节,并参阅OpenGL ES官方指南.因为And ...

  4. GUI显示系统之 SurfaceFlinger

    转载自http://blog.csdn.net/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue ...

  5. ]GUI显示系统之SurfaceFlinger

    转载自http://blog.csdn.net/uiop78uiop78/article/details/8954508 介绍了Surface, SurfaceTexture, BufferQueue ...

  6. Android显示系统详解

    一.显示系统的分类: 我们来思考一个问题:从普通用户角度来说,某个APP页面(例如购物APP首页)是怎么被显示到屏幕的? 首先看到的是物理屏幕,然后是屏幕中软件工程师编写的APP页面,也就是手机屏幕驱 ...

  7. Android图形合成和显示系统---基于高通MSM8k MDP4平台

    介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...

  8. Android系统Surface机制的SurfaceFlinger服务的线程模型分析

    在前面两篇文章中,我们分析了SurfaceFlinger服务的启动过程以及SurfaceFlinger服务初始化硬件帧缓冲区的过程.从这两个过程可以知道,SurfaceFlinger服务在启动的过程中 ...

  9. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    出自:http://blog.csdn.net/luoshengyang/article/details/8079456 在前面的一系列文章中,我们学习了Android应用程序与SurfaceFlin ...

最新文章

  1. 安卓高手之路之 应用篇
  2. paip.最好的脚本语言node js 环境搭建连接mysql
  3. html实时时间代码_价值十万代码之三-获取全部历史数据
  4. const char * 和 char const * 和 char * const 区别
  5. linux下c语言抓包库libpcap
  6. NGS基础 - 参考基因组和基因注释文件
  7. CSS属性和值--备份
  8. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
  9. 51单片机——LCD12864
  10. php 论坛回复引用功能,PHPWind商业版论坛功能介绍
  11. 2017年终总结,开始写博客的第一年
  12. 流媒体直播点播系统方案设计
  13. 李宏毅自然语言处理——GPT3简介
  14. linux双网卡配置两个ip,centos双线双ip配置,Windows双网卡双ip配置
  15. 【python量化】用时间卷积神经网络(TCN)进行股价预测
  16. cocos 随机变色的拖尾
  17. 华为OD机试 - 最短耗时(C++) | 附带编码思路 【2023】
  18. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能
  19. WAF(Web Application Firewall)
  20. PilotEdit v9.7

热门文章

  1. gulp-rev 添加版本号
  2. 水瓶座的人真的很冷血吗
  3. python对话机器人怎么搭建代码语言库_教你用python几十行代码编写对话机器人
  4. 勤于奋对国外LEAD项目,不留遗憾,不负此生
  5. js中clearInterval无效,以及setInterval中断后重新执行
  6. 服务器国产自研芯片,国产自研芯片新时代 龙芯A4000评测
  7. 简单的提示词操作融合微调 AI 图像
  8. NDA:Preventing Speculative Execution Attacks at Their Source
  9. 文件资源管理器设置打开为此电脑
  10. ROS————tf2介绍及教程