最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

LCD撕裂的產(chǎn)生原因和雙緩沖的概念

2023-10-27 15:08 作者:奧大梨呀  | 我要投稿

大家好,好久沒有發(fā)布視頻了,原本最近打算開一個新的系列,關(guān)于一些嵌入式相關(guān)經(jīng)驗(yàn)分享,其實(shí)也不算新的系列了吧,因?yàn)槲液茉缫郧熬蛧L試過發(fā)布一些相關(guān)的視頻,但是質(zhì)量不是很高。這次因?yàn)槠匠9ぷ鞣泵Φ脑?,再三思考后還是打算以專欄的形式發(fā)布這個系列,有空時寫寫。 由于我接觸最多的設(shè)備就是LCD了,因此打算以LCD的驅(qū)動為切入點(diǎn)開始分享,關(guān)于LCD的驅(qū)動大概會分為4期,分別是,

《LCD撕裂的產(chǎn)生原因和雙緩沖的概念》

《MCU如何高效地驅(qū)動LCD——RGB篇》

、

《MCU如何高效地驅(qū)動LCD——8080篇》

《MCU如何高效地驅(qū)動LCD——SPI篇》

。

LCD的刷新過程

首先來說一下LCD的刷新過程。為了便于理解,稍微簡化一下模型,把LCD看成是非常多個RGB LED的陣列,每個LED要亮什么顏色,都存儲在顯存GRAM里,LCD控制器需要不停地將GRAM里的顏色數(shù)據(jù)刷新到LCD面板上,為什么LCD需要刷新,相信玩過數(shù)碼管和點(diǎn)陣的朋友們不難理解,靜態(tài)驅(qū)動和動態(tài)驅(qū)動相比,動態(tài)驅(qū)動是可以節(jié)省很多IO的,何況是像素點(diǎn)這么多的LCD(節(jié)省寄存器),因此LCD每次只會驅(qū)動一行顯示,然后快速刷新才達(dá)到整個面板顯示的效果。在LCD刷新時就涉及到LCD控制器讀GRAM,即下文要說的讀指針。而我們要更改LCD上顯示的內(nèi)容,就需要修改GRAM數(shù)據(jù),這里涉及到主控寫GRAM,即下文要說的寫指針。同時,LCD還存在無效數(shù)據(jù)區(qū)域和有效數(shù)據(jù)區(qū)域。無效數(shù)據(jù)區(qū)域是我們在面板上看不到的,它不占用顯存,是為了對每一行進(jìn)行消隱和緩沖的,下文稱為非可視區(qū),而有效數(shù)據(jù)區(qū)域就是實(shí)實(shí)在在的占用顯存,是我們在LCD面板上可以看到的,下文稱為可視區(qū)。

LCD的撕裂

了解了LCD的刷新過程后再來說一下LCD的撕裂,什么是撕裂,顧名思義就是在LCD畫面產(chǎn)生變化時,如滑動頁面時,LCD上會出現(xiàn)圖像錯位的情況,錯位線的上面是一幀,下面又是另外一幀。本質(zhì)原因就是GRAM的讀寫指針在可視畫面中重合了,于是在刷那一幀時屏幕中就會出現(xiàn)一個錯位的現(xiàn)象,而這一幀持續(xù)的時間足以讓人眼察覺到。當(dāng)然如果畫面不動是看不到撕裂的,因?yàn)楫嬅娌粍訒r,每一幀都是一樣的,肯定看不出錯位。

LCD未撕裂的情況

LCD正常沒有撕裂現(xiàn)象的情況時,讀寫指針只會在非可視區(qū)重合,這分為3種情況,但這3種情況均有一個大前提,即LCD使用了讀寫指針同步,即我們平常所了解的垂直同步,這里借用一下網(wǎng)絡(luò)上的動圖解釋。

第一種:讀指針?biāo)俾实扔?倍的寫指針?biāo)俾?/p>

。當(dāng)一幀同步后,讀寫指針同時在GRAM首地址出發(fā)。在畫面從A幀切換為B幀這個過程中,讀指針一共讀取了2次GRAM,第一次在寫指針前面讀取,整個過程讀取到的全部是原本A幀的數(shù)據(jù);第二次讀指針從頭開始去追 寫指針,在寫指針后面讀取新的B幀數(shù)據(jù),整個過程讀取到的全部是寫指針已寫入的B幀數(shù)據(jù),當(dāng)寫詩指針寫完后,讀指針也剛好讀取刷新完畢,畫面上不存在有任何一幀錯位的情況。

第二種:寫指針數(shù)率等于2倍的讀指針?biāo)俾?/p>

。當(dāng)一幀同步后,讀寫指針同時在GRAM首地址出發(fā)。 在寫指針繪制A幀時,讀指針剛好跟在屁股后面讀A幀數(shù)據(jù);而當(dāng)寫指針開始繪制B幀時,讀指針剛好讀到GRAM的一半,根據(jù)追及問題,兩者肯定在最后一行相遇,整個過程也不會出現(xiàn)錯位的現(xiàn)象。但這種情況要做讀寫指針同步非常麻煩,更多的情況減小寫指針?biāo)俾逝c讀指針?biāo)俾氏嗤?,然后進(jìn)行同步。

第三種:雙緩沖

。這種情況其實(shí)可以看成第二種的變種。注意我這里說的雙緩沖是指LCD控制器層面上的雙緩沖,而不是僅僅是UI層面使用2個緩沖區(qū),下文會說一下這兩者的區(qū)別。對于雙緩沖而言,就是在讀寫指針同步之后(常見在非可視區(qū)同步),設(shè)置新的GRAM緩沖區(qū)給讀指針?biāo)⑿?,而另一個GRAM緩沖區(qū)則是交給主控去更新新內(nèi)容。為什么說這可以看成是第二種情況的變種呢,其實(shí)就相當(dāng)與讀寫指針同步后,寫指針一瞬間就寫完了GRAM,因?yàn)閷εc讀指針來說,GRAM相比上一幀的數(shù)據(jù),是一瞬間就變了的。這種用法通常在主控自帶LCD控制器的情況下見到,比如STM32的LTDC,具體的思路在后面《MCU如何高效地驅(qū)動LCD——RGB篇》文章中會詳細(xì)說明。

LCD撕裂的情況

說完了LCD正常沒有撕裂的情況,下面說說會產(chǎn)生撕裂的情況和原因。

第一種:寫指針?biāo)俾侍?,小于讀指針的二分之一

,對應(yīng)與上文無撕裂的第一種情況。這種情況非常好理解,主控寫一幀的速率太慢,人家LCD都刷了好幾幀了,你一幀還沒寫完,肯定會出現(xiàn)錯位現(xiàn)象。舉個極端一點(diǎn)的例子,在使用lvgl時,如果使用的緩沖區(qū)比較小,比如LCD面板的十分之一,那么這時候滑動頁面時就會看到明顯的“拉窗簾”現(xiàn)象,即出現(xiàn)了好幾條錯位線,瘋狂撕裂,就是因?yàn)橛捎诰彌_區(qū)過小,lvgl不得不將一幀拆分為好幾次渲染,因?yàn)橹虚g一些重復(fù)操作導(dǎo)致整體寫速率變慢。

第二種:沒有做讀寫指針同步導(dǎo)致寫指針太快讀指針跟不上

。最經(jīng)典最常見的例子就是有些游戲在沒有開啟垂直同步時,因?yàn)閹侍撸@示器刷新率跟不上導(dǎo)致的畫面撕裂。人家讀指針一幀都沒刷玩呢,寫指針下一幀都寫完了。

第三種:沒做讀寫指針同步導(dǎo)致導(dǎo)致讀寫指針在可視畫面中相撞

。這里區(qū)分與上面第二種,上面第二種是寫指針太快沒做同步導(dǎo)致的,而這一種是即使讀寫指針滿足2倍關(guān)系,也會導(dǎo)致撕裂,還記得上文正常未撕裂情況的大前提嗎,讀寫指針同步,這里就說說為什么要同步。處理撕裂不可缺少的就是讀寫指針同步,一旦少了這個,則上面正常未撕裂的情況也必然會導(dǎo)致撕裂。 舉個開發(fā)中常見的例子,我們都知道STM32的中高端MCU中有一個叫做DMA2D的外設(shè),它可以用于將處理好的數(shù)據(jù)快速地拷貝到顯存中供LTDC刷新。但是直接使用DMA2D拷貝肯定是會產(chǎn)生撕裂的,尤其是拷貝的數(shù)據(jù)越多,產(chǎn)生撕裂的概率越大,換句話說就是刷新的畫面分辨率越大,產(chǎn)生撕裂的概率越大。根本原因就是沒有做讀寫指針同步,正確的做法應(yīng)該是計(jì)算好DMA2D拷貝這塊數(shù)據(jù)所需的時間,然后在合適的行設(shè)置中斷,在中斷中進(jìn)行同步,當(dāng)然最好不要在中斷中進(jìn)行DMA2D拷貝,畢竟中斷講究快進(jìn)快出。具體的操作在后面《MCU如何高效地驅(qū)動LCD——RGB篇》文章中會詳細(xì)說明。

雙緩沖的概念

最后說一下,雙緩沖的一個誤區(qū),很多人以為雙緩沖可以避免撕裂,這是不完全對的。雙緩沖分為2種,分別是LCD控制器層面的雙緩沖和UI層面的雙緩沖,下面說說兩者的區(qū)別。

LCD控制器層面的雙緩沖

對與LCD控制器層面的雙緩沖,指的是LCD控制器具有切換顯存GRAM的功能。比如STM32的LTDC外設(shè)有一個寄存器CFBAR,即幀緩沖區(qū)地址寄存器,我們只需要定義2個幀緩沖區(qū),在需要的時候更改這個寄存器的值,就可以達(dá)到雙緩沖的效果,當(dāng)然不要忘了讀寫指針同步,即需要設(shè)置行中斷在非可視區(qū)(消隱區(qū))更改這個寄存器。不過LTDC具有影子寄存器,設(shè)置了并不會馬上更新,而是會自動在消隱區(qū)更新,由于篇幅的原因,這些內(nèi)容以及思路在后面的文章會詳細(xì)說明。這一層面的雙緩沖的作用是用來

解決畫面撕裂的。

UI層面的雙緩沖

而對于UI層面的雙緩沖,指的是UI具有2個緩沖區(qū)可以渲染圖像數(shù)據(jù),比如lvgl的雙緩沖。在lvgl使用單buffer(單緩沖)的情況下,lvgl渲染完這個buffer后,必須等待主控將整個buffer全部拷入LCD的GRAM后,才可以往這個buffer寫入新的數(shù)據(jù)。其中就需要等待一段時間,而這一段等待時間就會導(dǎo)致UI渲染幀間隔變長,幀率變低。但如果采用雙buffer(雙緩沖),lvgl渲染完其中一個buffer后,該buffer被拷貝到LCD的GRAM的同時,lvgl還可以在另一個buffer中渲染下一幀數(shù)據(jù),這樣可以縮短幀間隔,提高UI渲染幀率(但通常需要多核多線程或者DMA的支持)。這么看來,UI層面的雙緩沖的作用就很明顯了,即

提高UI渲染幀率。

兩者的主要區(qū)別在于作用不同,一個是為了解決畫面撕裂,一個是為了提高UI渲染幀率。

可是這兩者加起來不就需要4個緩沖區(qū)了嗎,這樣內(nèi)存開銷太大了。那能不能將2者結(jié)合在一起只用2個緩沖區(qū)呢,答案是可以的,但是是有前提條件的,對與不同驅(qū)動類型的LCD也各不相同,詳細(xì)內(nèi)容在這個系列后面的文章中會逐個說明。

小插曲

這里插一個小點(diǎn),幀率率其實(shí)也分為LCD幀率和UI幀率,LCD的幀率是固定的,與硬件有關(guān),而UI幀率是根據(jù)渲染的畫面復(fù)雜度而動態(tài)變化的。我們往往更關(guān)注UI的幀率,但如果UI的幀率平均超過了LCD的幀率后,如果你也跟我一樣追求極致的顯示效果,那么此時應(yīng)該將重點(diǎn)放在LCD的撕裂問題上,而不是一味地追求高幀率。換句話說,如果LCD的撕裂和UI幀率都保證了之后,應(yīng)該降低UI幀率保證二者同步或接近同步,以

釋放更多的CPU性能

來處理其他事務(wù)。 總結(jié)一下,文章講解了LCD撕裂的本質(zhì)原因、各種常見的情況以及兩個層面的雙緩沖的區(qū)別和作用。內(nèi)容有點(diǎn)多,感謝各位能看到這里的伙伴們。如果覺得對你有幫助的話還望點(diǎn)點(diǎn)大拇指,給Up一份支持。如果喜歡這個系列的可以點(diǎn)個關(guān)注,后面還會發(fā)布新的文章。

LCD撕裂的產(chǎn)生原因和雙緩沖的概念的評論 (共 條)

分享到微博請遵守國家法律
安阳市| 望奎县| 新宁县| 舟曲县| 宜阳县| 新宁县| 西乌珠穆沁旗| 自贡市| 宁强县| 古浪县| 阿勒泰市| 东阳市| 新源县| 高阳县| 长垣县| 兰溪市| 昭苏县| 什邡市| 山西省| 五寨县| 眉山市| 丰原市| 丽江市| 延寿县| 固原市| 高台县| 万宁市| 商南县| 大洼县| 河曲县| 蕉岭县| 红河县| 民勤县| 江阴市| 齐河县| 临沂市| 梁山县| 遂川县| 阿荣旗| 康定县| 耒阳市|