zoukankan      html  css  js  c++  java
  • LCD显示异常分析——撕裂(tear effect)【转】

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

    概述

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

    本文适用范围:

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

    现象

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

    image

    分析

    从上面的动态图我们可以看到,在第二帧出现了新旧画面各显示一部分的现象,该现象即为撕裂,英文又叫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):

    image

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

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

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

    image

    图1 (W:R=3:1)

    image

    图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起始位置开始扫描,具体过程如下图:

    image

    从上图我们可以看到,虽然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的;

    如下图:

    image

    结论

    撕裂的本质:

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

    解决方法:

    • W > R/2 (这里指速率)
    • 开启TE同步信号
    • 调整TE Output Line
  • 相关阅读:
    快速进去CF(codeforces)的方法
    【Java】【25】去除空格
    【Java】【24】正则
    【Word&Excel】【4】Excel去除重复的项
    【Word&Excel】【3】Excel替换某一行/列的内容
    【JS】【22】标签的background-image属性
    【JS】【21】换行
    【Spring】【2】使用注解@Scheduled执行定时任务
    【JS】【20】点击页面判断是否安装app并打开,否则跳转下载的方法
    【Java】【23】汉字转拼音
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/9581809.html
Copyright © 2011-2022 走看看