LCD顯示異常分析——撕裂(tear effect)【轉】

来源:https://www.cnblogs.com/linhaostudy/archive/2018/09/03/9581809.html
-Advertisement-
Play Games

轉自:[LCD顯示異常分析——撕裂(tear effect) ](https://blog.csdn.net/hexiaolong2009/article/details/79319512) 概述 在上一篇《 "LCD顯示異常分析——開機閃現花屏" 》中,我們一起分析了開機花屏的問題,在這一篇中,我 ...


轉自: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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 給定兩個以字元串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字元串形式。 示例 1: 示例 2: 說明: 從題目要求來看,應該是讓我們實現一個比較省記憶體的大數乘法,先分享幾個我在discuss中發現的不太切合題意的解法: 這個可以說是個毫無技術 ...
  • 一、概念和基本註解 從JDK1.5開始,引入了源代碼中的註解這一機制。註解使得 Java 源代碼中不但可以包含功能性的實現代碼,還可以包含元數據。 那麼什麼是元數據呢?所謂元數據,就是描述數據的數據。比如說一張圖片,圖片內容是它的主體數據,那麼像圖片的創建時間、修改時間、創建者等等這些數據,就是這張 ...
  • 一: 問題提出 現如今大家寫的netcore程式大多部署在linux平臺上,而且服務程式裡面可能會做各種複雜的操作,涉及到多數據源(mysql,redis,kafka)。成功部署成後臺 進程之後,你以為這樣就萬事大吉了? 卻不知當你更新代碼時,暴力的kill掉這個進程導致你的業務出現數據不一致,業務 ...
  • asp.net core mvc 管道之中間件 http請求處理管道通過註冊中間件來實現各種功能,松耦合併且很靈活 此文簡單介紹asp.net core mvc中間件的註冊以及運行過程 通過理解中間件,將asp.net core mvc分解,以便更好地學習 中間件寫法 先看一個簡單的中間件,next ...
  • 一看標題肯定會聯想到使用動態編織的方式實現AOP編程,不過這不是作者本文討論的重點。 本文討論另外三種在netcore中可實現的方式,Filter(過濾器,嚴格意義上它算是AOP方式),DynamicProxy(動態代理方式,JAVA上早已不是新鮮事),Middleware(netcore中間件所實 ...
  • 讀取Word文檔,並將文本轉成html標簽,後面發現,經常有帶上下角標的內容,於是一併處理了。 核心在於對XWPFRun對象中Subscript屬性的處理。 Word文檔: 輸出: <p>測試<sup>上</sup><sub>下</sub>ok。</p><p>CO<sub>2</sub></p><p ...
  • 概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,我們針對 DataGrid 控制項的 CollectionView 部分做了詳細分享。而在本篇,我們會對 Utilities 文件夾中的類做詳細的分享。 下麵是 Windows C ...
  • EFCore中沒有DbFirst了吧,應該都是Code First 先說說第一種,Code First From Database(DbFirst)資料庫先行,這種方式就要命令行了...(特不喜歡命令行。。): 1.建好項目後通過 NuGet 安裝所需依賴性: 可以右鍵項目通過管理NuGet程式包的 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...