转自:LCD显示异常分析——撕裂(tear effect)

概述

在上一篇《LCD显示异常分析——开机闪现花屏》中,我们一起分析了开机花屏的问题,在这一篇中,我将对LCD撕裂(tear effect)问题进行详细分析,以及给出这类问题的常用解决方法。

本文适用范围:

  • 对象:LCD驱动调试人员
  • 硬件:带GRAM的LCD (如SPI/MCU/DSI CMD屏)
  • 软件:所有嵌入式操作系统

现象

首先贴一张动态图,让大家能直观的感受撕裂形成的过程:

分析

从上面的动态图我们可以看到,在第二帧出现了新旧画面各显示一部分的现象,该现象即为撕裂,英文又叫tear effect。tear effect的根本原因是对GRAM的读、写速度不一致,导致在一帧之内,GRAM的读指针(R)与写指针(W)发生了重叠导致。

这个现象其实包含2个信息:

  1. W和R指针重叠了
  2. 指针重叠后的画面在屏上静止不动保持了整整1帧的时间(60fps的话就是16.7ms),这个时间是足以被人眼察觉到的

有经验的开发人员都知道,出现这类问题往往都是因为有个2倍关系没有调整好。何为“2倍关系”?即必须保证W:R > 1:2(这里的W、R都指的是速率),否则势必会出现撕裂的现象(如上面的W:R=1:3)。

理想情况

为什么是2倍?请看下图(W:R=1:2):

因为W < R,所以R指针跑在前面,因此读出来的数据都是旧数据,屏幕第1帧显示的还是上一帧的图像,直到第2帧才将GRAM中的图像完整的显示出来。如果R再稍微快那么一点,那么在第2帧R指针就又会赶上W指针,这样就会再次出现tear effect现象。所以W:R=1:2是撕裂发生的临界值。

同理,那如果对于W > R的情况,是否也存在这个2倍关系?

回答这个问题前,我们先来看看下面这两幅图:

图1 (W:R=3:1)

图2 (W:R=2:1)

从上面的图中我们可以看到,对于W > R这中情况,确实也存在2倍关系。但是这种由于W > R而造成的撕裂现象一般是不可能发生的,因为大部分显示驱动都是等到TE信号到来时才开始刷图的,所以只要R指针还没有扫描完当前帧的画面,W指针是不可能立即去GRAM中刷画面“B”的,一定会等到画面“A”彻底显示完毕后才开始绘制,所以上面的图1、图2两种情况都不会发生。

因此为了防止撕裂的发生,只需要保证W > R/2 (这里指速率)即可。

实际情况

前面分析的现象都是基于一个前提条件的,那就是:

指针W和R都是基于同一个时间点、同一个GRAM起始位置开始扫描的

只要上面的2点有一个不满足,那么2倍关系就不成立了。

因为对于这类带GRAM的LCD ,驱动软件或LCD Controller硬件都会做成等待TE信号到来时才会开始刷图,所以对于第1点这里不做详细描述,只针对第2点进行讲解。在LCD的实际显示过程中,其实是有消隐区的(即Porch区域),而且一般屏厂会将TE信号默认放在内部DriverIC的VSYNC阶段送出,这就导致了指针W无法满足和R从同一GRAM起始位置开始扫描,具体过程如下图:

从上图我们可以看到,虽然W:R=2:3,满足W > R/2的条件,但是由于它们不是从GRAM的同一起始位置开始扫描,所以仍然会出现W和R指针碰头的情况,最终导致撕裂的现象。

那么对于上述这种情况,有什么方法可以解决吗?是时候召唤出TE Output Line了!

TE Output Line

LCD DriverIC厂商还是很贴心的,为了解决上述问题,工程师们专门预留了一个TE Output Line寄存器,该寄存器的作用就是用来调节TE信号(又叫FMARK信号)的输出位置。默认情况下,该寄存器的值为0,即DriverIC内部刷新时的VSYNC期间。那么对于上述情况,我们只需要将TE Output Line的值设置为VSYNC+VBP的值即可。

  • 对于主控端,Vporch往往由VSYNC+VBP+VFP构成;
  • 对于LCD DriverIC厂商,他们定义的VBP其实往往是包含VSYNC的;

如下图:

结论

撕裂的本质:

  1. 在1帧时间内,W和R重叠了
  2. 撕裂的画面停留了1帧的时间,被人眼所觉察

解决方法:

  • W > R/2 (这里指速率)
  • 开启TE同步信号
  • 调整TE Output Line

LCD显示异常分析——撕裂(tear effect)【转】的更多相关文章

  1. LCD显示异常分析——开机闪现花屏【转】

    转自LCD显示异常分析--开机闪现花屏 最近在工作中,有同事遇到LCD开机瞬间会闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现. 其实这类问 ...

  2. LCD 显示异常定位分析方法

    第一种情况: 进入kernel或android 后,如果LCM图像示异常,可以通过如下步骤来判断问题出现在哪个层面. step1:通过DMMS截图,来判断上面刷到LCM的数据是否有问题. 若DMMS获 ...

  3. LCD底层驱动分析

    根据分析的框架,自己写一个LCD驱动程序 1分析LCD硬件原理图 Von和Voff接的是一个电源电路,通过LCD_POWER接的是GPG4来控制LCD电源,高电平表示开启LCD电源 VM接的是CPU的 ...

  4. IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  5. RB1001: IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常

    标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...

  6. Android异常分析(转)

    关于异常 异常? 异常就是一种程序中没有预料到的问题,既然是没有预料到的,就可能不在原有逻辑处理范围内,脱离了代码控制,软件可能会出现各种奇怪的现象.比如:android系统常见异常现象有应用无响应. ...

  7. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)

    在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...

  8. 关于FusionCharts图表宽度width的设置问题导致图表显示异常的解决办法

    关于FusionCharts图表宽度width的设置问题导致图表显示异常的解决办法 题设: 经常使用FusionCharts图表的朋友可能会遇到这个问题.就是在FusionCharts显示的时候有时候 ...

  9. PC上图标显示异常 白色框框处理方案

    步骤如下: 1.打开360安全卫士,点击图标显示异常的立即修复 2.修复完,图标就正常了 3.分析原因: 可能是我用了魔方优化大师(TweakerCube)优化了桌面快捷方式(去掉箭头)引起的,而且是 ...

随机推荐

  1. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...

  2. 如何把开源项目发布到Jcenter

    转载自:https://www.jianshu.com/p/f66972f0607a 首先我们应该注册一个JFrog Bintray的账号 Jfrog Bintray官网 这里我们可以注意到那个绿色的 ...

  3. rhel 配置centos源

    1.删除自带的yum包,清除/etc/yum.repos.d下面的文件 rpm -qa|grep yum|xargs rpm -e --nodeps(不检查依赖,直接删除rpm包) 2.安装cento ...

  4. 从完整备份恢复单个innodb表

    现在大多数同学在线上采取的备份策略都是xtrabackup全备+binlog备份,那么当某天某张表意外的删除那么如何从xtrabackup全备中恢复呢?从mysql 5.6版本开始,支持可移动表空间( ...

  5. 方便操作的命名范围scope

    <?php namespace Goods\Model; use Think\Model; class GoodsModel extends Model { protected $_scope ...

  6. 页面滚动显示或隐藏元素Headroom.js插件帮助你实现滚动效果

    Headroom.js 是什么? Headroom.js 是一个轻量级.高性能的JS小工具(不依赖任何工具库!),它能在页面滚动时做出响应.此页面顶部的导航条就是一个鲜活的案例,当页面向下滚动时,导航 ...

  7. [TJOI 2018]智力竞赛

    Description 题库链接 给出一张 \(m\) 个点的有向图.问可重最小路径覆盖是否 \(\leq n+1\) .若不,求最多用 \(n+1\) 条路径去覆盖,最大化未覆盖点点权最小值. \( ...

  8. System V 与 POSIX 简介与对比

    当我们在 Linux 系统中进行进程间通信时,例如信号量,消息队列,共享内存等方式,会发现有System V以及POSIX两种类型.今天我们就来简单介绍下它们. POSIX: POSIX(Portab ...

  9. 程序员快速掌握的UI设计技巧

    一.概要 功能与内在很关键,UI与外表也重要. 1.1.选择主色调 1.1.1.三原色 三原色指色彩中不能再分解的三种基本颜色,我们通常说的三原色,即红.黄.蓝.三原色可以混合出所有的颜色,同时相加为 ...

  10. Mongodb 集群实战

    该实战过程完全跟着官网一步一步实现 ,官网教程:https://docs.mongodb.com/manual/tutorial/atlas-free-tier-setup/ 使用Mongo Shel ...