转载自:https://blog.csdn.net/zhaizu/article/details/51882768

转载本文的意义在于自我收藏与反思:SwapChain这个东西与Vsync的关系?Vysnc是帧同步信号

  • 前言
  • 帧率 vs 屏幕刷新频率
    • 帧率
    • 屏幕刷新频率
  • VSync 是啥
  • VSync 有啥作用
    • 单缓存
    • 双重缓存Double Buffer
    • 三重缓存Triple Buffer
  • 更多文章

前言

本文讲解 VSync 产生的原因及其作用。内容涉及如下方面:

  • 帧率 vs 屏幕刷新频率;
  • 单缓存,双重缓冲,三重缓存及各自的优缺点;
  • VSync 的工作过程;

帧率 vs 屏幕刷新频率

帧率

即 Frame Rate,单位 fps,是指 gpu 生成帧的速率,如 33 fps,60fps,越高越好。

屏幕刷新频率

即 Refresh Rate 或 Scanning Frequency,单位赫兹/Hz,是指设备刷新屏幕的频率,该值对于特定的设备来说是个常量,如 60hz。

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

对于一个特定的设备,帧率和刷新频率没有必然的大小关系。

VSync 是啥

安卓系统中有 2 种 VSync 信号:屏幕产生的硬件 VSync 和由 SurfaceFlinger 将其转成的软件 Vsync 信号。后者经由 Binder 传递给 Choreographer。 
硬件 VSync 是一个脉冲信号,起到开关或触发某种操作的作用。 
更多信息请自行复习《计算机组成原理》或《数字电路与逻辑设计》等大学教材(就像考研备考的时候研友感慨的:出来混,迟早要还的,当时没学好,现在还得接着学)。

VSync 有啥作用

单缓存

在第一章我们讲到,帧率和刷新频率没有必然的大小关系。先记住这一点。 
首先,我们来看下,没有引入 VSync 时,屏幕显示图像的工作流程。

如上图,CPU/GPU 向 Buffer 中生成图像,屏幕从 Buffer 中取图像、刷新后显示。这是一个典型的生产者——消费者模型。 
理想的情况是帧率和刷新频率相等,每绘制一帧,屏幕显示一帧。而实际情况是,二者之间没有必然的大小关系,如果没有锁来控制同步,很容易出现问题。例如,当帧率大于刷新频率,当屏幕还没有刷新第 n-1 帧的时候,GPU 已经在生成第 n 帧了,从上往下开始覆盖第 n-1 帧的数据,当屏幕开始刷新第 n-1 帧的时候,Buffer 中的数据上半部分是第 n 帧数据,而下半部分是第 n-1 帧的数据,显示出来的图像就会出现上半部分和下半部分明显偏差的现象,我们称之为 “tearing”,如下图:

双重缓存(Double Buffer)

注意,此处的“双缓冲”和计算机组成原理中的“二级缓存”是两回事。三重缓存也是如此。 
为了解决单缓存的“tearing”问题,双重缓存和 VSync 应运而生。双重缓存模型如下图:

两个缓存区分别为 Back Buffer 和 Frame Buffer。GPU 向 Back Buffer 中写数据,屏幕从 Frame Buffer 中读数据。VSync 信号负责调度从 Back Buffer 到 Frame Buffer 的复制操作,可认为该复制操作在瞬间完成。其实,该复制操作是等价后的效果,实际上双缓冲的实现方式是交换 Back Buffer 和 Frame Buffer 的名字,更具体的说是交换内存地址(有没有联想到那道经典的笔试题目:“有两个整型数,如何用最优的方法交换二者的值?”),通过二位运算“与”即可完成,所以可认为是瞬间完成。

双缓冲的模型下,工作流程这样的: 
在某个时间点,一个屏幕刷新周期完成,进入短暂的刷新空白期。此时,VSync 信号产生,先完成复制操作,然后通知 CPU/GPU 绘制下一帧图像。复制操作完成后屏幕开始下一个刷新周期,即将刚复制到 Frame Buffer 的数据显示到屏幕上。

在这种模型下,只有当 VSync 信号产生时,CPU/GPU 才会开始绘制。这样,当帧率大于刷新频率时,帧率就会被迫跟刷新频率保持同步,从而避免“tearing”现象。

注意,当 VSync 信号发出时,如果 GPU/CPU 正在生产帧数据,此时不会发生复制操作。屏幕进入下一个刷新周期时,从 Frame Buffer 中取出的是“老”数据,而非正在产生的帧数据,即两个刷新周期显示的是同一帧数据。这是我们称发生了“掉帧”(Dropped Frame,Skipped Frame,Jank)现象。

三重缓存(Triple Buffer)

双重缓存的缺陷在于:当 CPU/GPU 绘制一帧的时间超过 16 ms 时,会产生 Jank。更要命的是,产生 Jank 的那一帧的显示期间,GPU/CPU 都是在闲置的。 
如下图,A、B 和 C 都是 Buffer。蓝色代表 CPU 生成 Display List,绿色代表 GPU 执行 Display List 中的命令从而生成帧,黄色代表生成帧完成。

如果有第三个 Buffer 能让 CPU/GPU 在这个时候继续工作,那就完全可以避免第二个 Jank 的发生了!

于是就有了三缓存:

工作原理同双缓冲类似,只是多了一个 Back Buffer。

需要注意的是,第三个缓存并不是总是存在的,只要当需要的时候才会创建。之所以这样,是因为三缓存会显著增加用户输入到显示的延迟时间。如上图,帧 C 是在第 2 个刷新周期产生的,但却是在第 4 个周期显示的。最坏的情况下,你会同时遇到输入延迟和卡顿现象。

更多文章

写博客的初衷不是分享,而是帮助自己总结整理、深化记忆。 
也许本文不值一看,但是下面这些文章则不然:

  • Android Performance Patterns: Understanding VSYNC
  • Google I/O 2012 - For Butter or Worse: Smoothing Out Performance in Android UIs
  • Getting To Know Android 4.1, Part 3: Project Butter - How It Works And What It Added
  • Google I/O 2011: Accelerated Android Rendering
  • Triple Buffering: Why We Love It
  • Android图形显示系统(一)

转载:理解 VSync相关推荐

  1. [转载] 理解RESTful架构

    原文: http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架构 作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意 ...

  2. [转载]理解OAuth 2.0

    原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 理解OAuth 2.0 作者: 阮一峰 OAuth是一个关于授权(authoriz ...

  3. 学习Javascript闭包(Closure)(转载+理解心得)

    以前看了闭包的文章,感觉都没有这次理解的深刻,主要是说到了把"局部函数返回给了全局变量",而根据我的理解,全局变量是在内存里专门分配了一块. 从程序开始直到结束一直存在的,所以闭包 ...

  4. 快速理解 VSync

    前言     帧率 vs 屏幕刷新频率         帧率         屏幕刷新频率     VSync 是啥     VSync 有啥作用         单缓存         双重缓存Do ...

  5. [转载]理解PYTHON中的装饰器

    [翻译]理解PYTHON中的装饰器 来源stackoverflow上的问题 链接 python的函数是对象 要理解装饰器,首先,你必须明白,在python中,函数是对象. 这很重要. 简单例子来理解为 ...

  6. linux内存机制的virt,关于linux:转载理解virt-res-shr之间的关系

    想必在linux上写过程序的同学都有剖析过程占用多少内存的经验,或者被问到这样的问题--你的程序在运行时占用了多少内存(物理内存)?通常咱们能够通过top命令查看过程占用了多少内存.这里咱们能够看到V ...

  7. Android帧的产生(2)——FPS、Vsync和Triple Buffer

    刷新率和帧率--60fps和60hz 屏幕刷新率是一个硬件的概念,是说屏幕这个硬件刷新画面的频率. 帧率FPS 是 Frame Per Second 的缩写,意思是每秒产生画面的个数,是一个软件的概念 ...

  8. Android 之 Project Butter 详细介绍

    现在我们已经很少能够听到关于 Android UI 卡顿的话题了,这得益于 Google 长期以来对 Android 渲染性能的重视,基本每次 Google I/O 都会花很多篇幅讲这一块.随着时间的 ...

  9. 【机器学习】传统目标检测算法之HOG

    转载+理解:hog:https://www.cnblogs.com/wyuzl/p/6792216.html hog:https://blog.csdn.net/masibuaa/article/de ...

最新文章

  1. 2019.7.15随笔
  2. Spring - @CompentScan全解
  3. 原来 Matplotlib 绘图也可以这么漂亮,这次真的是学习到了!
  4. c语言switch的作用域,你真的懂switch吗?聊聊switch语句中的块级作用域
  5. 拓端tecdat|用Python进行图像模糊处理和特征提取
  6. 微信转发别人语音的方法
  7. 全球及中国直流调速器行业市场调研及未来发展趋势预测报告2022-2027年
  8. 【操作系统】结合哲学家进餐问题分析如何预防死锁
  9. 交会定点(前方交会、测边交会、后方交会)程序C++代码
  10. 《读书是教师最好的修行》读后感优秀范文2200字
  11. 用 Python 统计字数
  12. JS面向对象的三种写法
  13. 浅谈STM32的三种Boot模式
  14. 定时器Timer使用
  15. Coursera | Introduction to Data Science in Python(University of Michigan)| Assignment3
  16. Android Weekly #38 :Android 13 正式发布
  17. 2021软考数据库工程师复习笔记记录
  18. 0904、kali、使用john破解密码、nmap扫描、抓包、安全加固、Linux加固
  19. 跟小甲鱼学Web开发笔记07
  20. 塔望食品品牌策划:盘点食品产业变化4大关键词及3大发展趋势

热门文章

  1. 基于Python的统计建模
  2. 编程计算机公司加乘,实训一计算器编程的实现
  3. 什么是自动化运维?为什么选择Python做自动化运维?
  4. 解决 Vmware 虚拟机安装linux系统无法联网的的问题
  5. android EditText 属性
  6. 词向量经典模型:从word2vec、glove、ELMo到BERT
  7. 电脑硬盘速度明显变慢的原因
  8. 等保测评--管理制度安全测评
  9. C语言|const的使用
  10. 合理运营在线教育社群