OpenGL之 圖片撕裂霎箍、掉幀及二三級緩存

一奇钞、圖片撕裂

image.png

如圖,很多人在游戲中應(yīng)該都見過這種情況漂坏,在某個界面景埃,出現(xiàn)上下兩部分?jǐn)鄬拥那闆r,這個就是圖片撕裂顶别。

1谷徙、出現(xiàn)原因

出現(xiàn)圖片撕裂的主要原因就是,視頻控制器的顯示速度比不上GPU的處理圖形的速度驯绎。

在GPU拿到位圖數(shù)據(jù)之后完慧,會通過GPU進(jìn)行圖形處理,并顯示到屏幕上剩失,過程為 GPU渲染->存入幀緩存區(qū)-> 視頻控制器 -> 讀取幀緩存區(qū)信息 -> 數(shù)模轉(zhuǎn)化(數(shù)字信號處->模擬型號) -> 逐行顯示到屏幕上屈尼。

因此,當(dāng)?shù)谝粠膱D像正在逐行顯示且并未完全顯示完成的時候拴孤,GPU拿到了新的數(shù)據(jù)脾歧,且存入了幀緩存區(qū),而后視頻控制器讀取的幀緩存區(qū)的位圖信息演熟,是新的一幀的位圖信息鞭执,這個時候,就會出現(xiàn)圖片斷層芒粹,即圖片撕裂兄纺。

2、解決辦法

在iOS中引入了垂直信號vSync+雙緩存區(qū)doubleBuffering的方式來解決圖片撕裂化漆。

2.1 垂直信號vSync

幀緩存區(qū)加鎖估脆,在上一幀緩存區(qū)位圖數(shù)據(jù)完全顯示之前,GPU即使拿到了新一幀的數(shù)據(jù)获三,也不存入幀緩存區(qū)旁蔼,直到上一幀顯示完全。

2.2 雙緩存區(qū)doubleBuffering

GPU會開辟A和B兩個緩存區(qū)疙教。

基本流程就是棺聊,當(dāng)A 幀緩存區(qū)拿到一幀數(shù)據(jù),就會給A 幀緩存區(qū)加上鎖贞谓,此時限佩,如果GPU拿到新一幀的數(shù)據(jù),則會存入B幀緩存區(qū)裸弦,不會存入A幀緩存區(qū)祟同,直到A幀緩存區(qū)的數(shù)據(jù)逐行掃描完成之后,A 幀緩存區(qū)才會解鎖理疙。

二晕城、掉幀

通過垂直信號vSync + 雙緩存區(qū)doubleBuffering能夠較好的解決圖片撕裂的問題,但是同時窖贤,卻引入了另外一個問題砖顷,那就是掉幀。

掉幀.png
1赃梧、形成原因

掉幀的本質(zhì)其實是顯示了同一幀的數(shù)據(jù)滤蝠,在iOS中,每一幀的處理時間是1/60 ≈ 16.67ms授嘀。在vSync信號到來之后物咳,CPU會開始做各種計算、解碼等工作蹄皱,并將結(jié)果交給GPU览闰,由GPU做各種變換、合成巷折、渲染等工作焕济,而后GPU會把結(jié)果交給幀緩存區(qū),在下一次vSync到來的時候盔几,逐行顯示到屏幕上晴弃。而掉幀的主要原因是 ,當(dāng)下一次vSync到來的時候逊拍,在二級緩存的情況之下上鞠,CPU/GPU并沒有成功的把數(shù)據(jù)提交給幀緩存區(qū),而此時芯丧,屏幕只能渲染舊的幀芍阎,因此形成了掉幀。

2缨恒、解決辦法谴咸?轮听??

事實上岭佳,掉幀的問題不能夠完全解決血巍,只能盡可能的減少。
為了盡可能減少掉幀問題珊随,從而引入了三級緩存述寡。本質(zhì)就是再增加一個離屏緩存區(qū)。

基本流程是叶洞,在顯示A緩存區(qū)數(shù)據(jù)的時候鲫凶,同時B和C緩存區(qū)會渲染下兩幀的數(shù)據(jù),周而復(fù)始的衩辟,CPU/GPU會不停的循環(huán)處理螟炫、渲染下兩幀的數(shù)據(jù),從而緩解掉幀的問題艺晴。

綜上總結(jié)一下屏幕卡頓原因

1不恭、CPU/GPU 渲染流?線耗時過?導(dǎo)致掉幀

  1. 垂直同步Vsync + 雙緩存區(qū) DoubleBuffering 以掉幀為代價解決了圖片撕裂;
  2. 三緩存區(qū): 合理使?CPU/GPU的空閑時間财饥, 以減少掉幀次數(shù)换吧。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钥星,隨后出現(xiàn)的幾起案子沾瓦,更是在濱河造成了極大的恐慌,老刑警劉巖谦炒,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贯莺,死亡現(xiàn)場離奇詭異,居然都是意外死亡宁改,警方通過查閱死者的電腦和手機(jī)缕探,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來还蹲,“玉大人爹耗,你說我怎么就攤上這事∶蘸埃” “怎么了潭兽?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斗遏。 經(jīng)常有香客問我山卦,道長,這世上最難降的妖魔是什么诵次? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任账蓉,我火速辦了婚禮枚碗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铸本。我一直安慰自己肮雨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布归敬。 她就那樣靜靜地躺著,像睡著了一般鄙早。 火紅的嫁衣襯著肌膚如雪汪茧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天限番,我揣著相機(jī)與錄音舱污,去河邊找鬼。 笑死弥虐,一個胖子當(dāng)著我的面吹牛扩灯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霜瘪,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼珠插,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颖对?” 一聲冷哼從身側(cè)響起捻撑,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缤底,沒想到半個月后顾患,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡个唧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年江解,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徙歼。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡犁河,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魄梯,到底是詐尸還是另有隱情呼股,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布画恰,位于F島的核電站彭谁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏允扇。R本人自食惡果不足惜缠局,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一则奥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狭园,春花似錦读处、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绎谦,卻和暖如春管闷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窃肠。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工包个, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冤留。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓碧囊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纤怒。 傳聞我的和親對象是個殘疾皇子糯而,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353