显示器原理

首先我们先要了解一下屏幕的刷新原理,目前显示器大体分为CRT显示器和液晶显示器这两个种类。

屏幕图像的刷新通过扫描帧缓存位图的方式进行刷新,扫描分为随机扫描方式和光栅扫描方式。

1.随机扫描方式(如下图)电子束的移动方式是随机的,按照显示命令用画线的方式绘出图形。

图1

2.光栅扫描方式(如下图)是从上至下逐行扫描整个屏幕的

图2

3.显示器刷新屏幕原理(如下图),以CRT 的电子枪为例子

图3

如图所示,CRT 的电子枪从上到下逐行扫描,扫描完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次扫描。就是这样子不听的扫面,实现屏幕图像的刷新,而这样子的刷新操作就会出现本文说的撕裂现象,请往下了解。

图像显示到屏幕原理

图4

好明显可以知道图像显示是需要CPU与GPU协同合作完成的。那么他们的分工是如何呢?

· CPU:计算视图frame,图片解码,需要绘制纹理图片通过数据总线(bus)交给GPU。

· GPU:纹理混合,顶点变换计算,像素点的填充计算,然后得到的位图渲染到帧缓冲区中。

· 时钟信号:垂直同步信号V-Sync/水平同步信号H-Sync。(结合图3)

HSync:当电子枪换到新的一行,准备进行扫描时,显示器会发出一个水平同步信号,简称 HSync         (horizonal synchronization)。

VSync:当一帧画面绘制完成后,电子枪回复到原位,准备画下一帧前,显示器会发出一个垂直同步信      号,简称VSync(vertical synchronization)。

屏幕撕裂的现象与原因

图5

为什么出现这种现象呢?

因为扫面显示缓冲区位图的时候,图片发生了切换,导致上半部分是旧的图片下半部分是新的图片。且由于各种原因(耗时,性能,计算复杂度),CPU与GPU的操作本身是好难实现同步的。

图6

那么解决撕裂现象,iOS这边引入了垂直同步-V-Sync + 双缓存-DoubleBuffering。

垂直同步信号其实就是给帧缓存加锁,确保在扫描原始位图时不会切换到新的位图,防止出现撕裂的情况。而双帧缓冲区的出现,就能够保证显示完原始图片时候在切换到新的位图进行显示。如图所示

图7

GPU 会预先渲染好一帧放入一个缓存区内(前帧缓存)。

在显示器发出VSync后,视频控制器的指针会指向前帧缓存区并开始读取,GPU开始渲染下一帧,并将渲染结果放入另一个缓存区(后帧缓存)。

在显示器发出新的VSync后,视频控制器的指针会指向后帧缓存区并开始读取,GPU开始渲染下一帧,并将渲染结果放入前帧缓存区。

双缓存和VSync造成的问题--掉帧(卡顿)

由于每一帧画面都要先经过CPU的计算然后交给GPU进行渲染,得出的位图放进缓冲区供视频控制器读取。由于垂直同步的机制,如果在一个VSync时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,而这时显示屏会保留之前的内容不变,也就造成界面卡顿。如下图所示,A、B代表两个缓存区。

图8

三缓冲区的出现

由于垂直信号+双缓冲区会出现掉帧的问题,所以有些设备就引入了三缓冲区+垂直信号,但iOS设备一直都是双缓存+垂直同步机制。

图9

三缓冲区的原理其实与双缓冲区原理差不多,只是多了一个可用的buffer,目的就是为了减少掉帧的机率,不能完全解决掉帧的问题。

参考

java撕裂_屏幕撕裂与卡顿分析相关推荐

  1. iOS基础:【屏幕成像与卡顿】屏幕撕裂 Screen Tearing、 掉帧 Jank、三缓冲 Triple Buffering

    文章目录 前言 I.屏幕成像与卡顿完整的流程 1.1 扫描的流程 1.2 屏幕撕裂 Screen Tearing 1.2.1 采用[垂直同步 Vsync + 双缓冲机制 Double Bufferin ...

  2. android 动画卡顿分析工具

    android 动画卡顿分析工具 Android应用性能优化之分析工具 上一次记录了解决过度绘制的过程,这一次,想先弄清个概念性的东西,就是如何判断顺不顺畅? 这东西其实最初我自己也觉得有点废话,用起 ...

  3. Systrace 流畅性实战 2 :案例分析: MIUI 桌面滑动卡顿分析

    当我们说 流畅度 的时候,我们说的是什么?不同的人对流畅性(卡顿掉帧)有不同的理解,对卡顿阈值也有不同的感知,所以有必要在开始这个系列文章之前,先把涉及到的内容说清楚,防止出现不同的理解,也方便大家带 ...

  4. Impala-shell卡顿分析——记一次曲折的Debug经历

    Impala-shell卡顿分析--记一次曲折的Debug经历 问题发现 最近准备在Impala中增加对UTF-8的支持,以修正跟Hive.Spark等基于Java的系统在UTF-8字符串上的不兼容表 ...

  5. 移动端测试 APP启动性能分析 WebView性能分析 H5性能分析 卡顿分析 帧分析 CPU统计 网络流量分析 耗电量指标 弱网测试 健壮性测试 兼容性测试 Amdahl

    Android官网使用指南性能:https://developer.android.com/topic/performance 一.APP启动性能分析 APP的启动过程 调用起APP.创建一个空白窗口 ...

  6. Android列表滑动卡顿分析与优化

    一 目标 尝试解决首页 HomeFragment 在低端机型上滑动存在卡顿的问题. 二 测试设备 华为荣耀 9i Android 8.0 内存 4G CPU 麒麟659 三 数据采样 刚进应用存在 M ...

  7. java线程太多卡顿_性能优化之卡顿延迟

    和你一起终身学习,这里是程序员 Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: 1.UI 渲染简介 2.识别延迟 3.Visual insp ...

  8. 我的世界java版特别卡怎么办_我的世界卡顿延迟怎么办

    首先要保证你的java版本与你的系统要匹配,然后确认下载的是纯净版本的我的世界,如果mod过多建议重新下载.以上两步确认后在启动器设置里将游戏最大内存减小:默认为1024M,可改为512M.改完之后进 ...

  9. Android—屏幕适配和卡顿优化

    各自的定义: px:pixel,像素,屏幕上实际的像素点单位 dpi: dot per inch,每英寸多少点,该值越高,则图片越细腻 dp: dip,Density-independent pixe ...

最新文章

  1. 原始样式增加标题_好看又实用! 10个标题字体设计技巧
  2. python中if语句中可用break_【第四篇】Python的if语句/for..in循环/while循环/break和continue...
  3. r型聚类典型指标_文献解读 | 缺陷和非缺陷型精神分裂症脑网络功能紊乱的共性和异性...
  4. VUE自学日志02-应用与组件实例
  5. [Azure] 使用 Visual Studio 2013 管理中国版 Azure 订阅
  6. python keystone_keystone命令与client接口学习
  7. Android修改kernel logo和开机动画(android)
  8. DZ先生怪谈视图库GA/T1400之人脸对象
  9. 2021华为软挑赛复盘
  10. java面试笔试大全
  11. c语言程序中文复制到word变乱码,怎么复制C程序代码到Word不会有乱码,不会有乱字等情况...
  12. 有了这个列表,程序员不愁没练手的小项目了
  13. 怎么样用计算机计算三角函数,怎样在科学计算器上计算三角函数
  14. 计算机实验原理word,完整word版计算机组成原理实验报告 微控制器
  15. 调制解调器 已删除 不可使用的设备
  16. matlab论文致谢,大学毕业论文致谢信3篇
  17. android 谷歌定位demo,android实现定位与目的地的导航示例代码
  18. tableau各种精典示例经验总结01
  19. 58同城和赶集网要合并了!
  20. 小程序导航栏颜色设置

热门文章

  1. 计算机小白可以学python吗_非计算机专业小白如何系统学Python语言
  2. mysql使用中文报错,hibernate mysql 插入中文错误
  3. java中id name_关于DOM对象中的id与name的区别
  4. java通道 硬件通道 如何联系_Java NIO5:通道和文件通道
  5. Halcon数据类型
  6. C++ static、const和static const类型成员变量声明及其初始化
  7. python发邮件图片太长显示不出来_Python电子邮件图像太长,无法显示,为什么Python在发送多图表电子邮件时只显示第一个图像?,python,发邮件,图片,不,出来,第一张...
  8. logrotate 命令切换linux系统日志
  9. access数据库窗体设计实验报告_access计算机实验报告:窗体
  10. access抓取数据_十年数据库流行度,哪款是你的最爱