【iOS】界面優(yōu)化

本文是在前人總結(jié)的基礎(chǔ)上進(jìn)行高度概括贮庞,簡單介紹造成界面卡頓的原因和解決思路峦筒。


屏幕成像原理
屏幕成像原理.png

首先從過去的 CRT 顯示器原理說起。CRT 的電子槍按照上面方式窗慎,從上到下一行行掃描物喷,掃描完成后顯示器就呈現(xiàn)一幀畫面,隨后電子槍回到初始位置繼續(xù)下一次掃描遮斥。為了把顯示器的顯示過程和系統(tǒng)的視頻控制器進(jìn)行同步脯丝,顯示器(或者其他硬件)會用硬件時鐘產(chǎn)生一系列的定時信號。當(dāng)電子槍換到新的一行伏伐,準(zhǔn)備進(jìn)行掃描時宠进,顯示器會發(fā)出一個水平同步信號(horizonal synchronization),簡稱 HSync藐翎;而當(dāng)一幀畫面繪制完成后材蹬,電子槍回復(fù)到原位,準(zhǔn)備畫下一幀前吝镣,顯示器會發(fā)出一個垂直同步信號(vertical synchronization)堤器,簡稱 VSync。顯示器通常以固定頻率進(jìn)行刷新末贾,這個刷新率就是 VSync 信號產(chǎn)生的頻率闸溃。盡管現(xiàn)在的設(shè)備大都是液晶顯示屏了,但原理仍然沒有變拱撵。

計算機(jī).png

通常來說辉川,計算機(jī)系統(tǒng)中 CPU、GPU拴测、顯示器是以上面這種方式協(xié)同工作的乓旗。CPU 計算好顯示內(nèi)容提交到 GPU,GPU 渲染完成后將渲染結(jié)果放入幀緩沖區(qū)集索,隨后視頻控制器會按照 VSync 信號逐行讀取幀緩沖區(qū)的數(shù)據(jù)屿愚,經(jīng)過可能的數(shù)模轉(zhuǎn)換傳遞給顯示器顯示汇跨。

在最簡單的情況下,幀緩沖區(qū)只有一個妆距,這時幀緩沖區(qū)的讀取和刷新都都會有比較大的效率問題穷遂。為了解決效率問題,顯示系統(tǒng)通常會引入兩個緩沖區(qū)娱据,即雙緩沖機(jī)制蚪黑。在這種情況下,GPU 會預(yù)先渲染好一幀放入一個緩沖區(qū)內(nèi)吸耿,讓視頻控制器讀取祠锣,當(dāng)下一幀渲染好后,GPU 會直接把視頻控制器的指針指向第二個緩沖器咽安。如此一來效率會有很大的提升伴网。

雙緩沖雖然能解決效率問題,但會引入一個新的問題妆棒。當(dāng)視頻控制器還未讀取完成時澡腾,即屏幕內(nèi)容剛顯示一半時,GPU 將新的一幀內(nèi)容提交到幀緩沖區(qū)并把兩個緩沖區(qū)進(jìn)行交換后糕珊,視頻控制器就會把新的一幀數(shù)據(jù)的下半段顯示到屏幕上动分,造成畫面撕裂現(xiàn)象,如下圖:

ios_vsync_off.jpg

為了解決這個問題红选,GPU 通常有一個機(jī)制叫做垂直同步(簡寫也是 V-Sync)澜公,當(dāng)開啟垂直同步后,GPU 會等待顯示器的 VSync 信號發(fā)出后喇肋,才進(jìn)行新的一幀渲染和緩沖區(qū)更新坟乾。這樣能解決畫面撕裂現(xiàn)象,也增加了畫面流暢度蝶防,但需要消費(fèi)更多的計算資源甚侣,也會帶來部分延遲。

那么目前主流的移動設(shè)備是什么情況呢间学?從網(wǎng)上查到的資料可以知道殷费,iOS 設(shè)備會始終使用雙緩存,并開啟垂直同步低葫。而安卓設(shè)備直到 4.1 版本详羡,Google 才開始引入這種機(jī)制,目前安卓系統(tǒng)是三緩存+垂直同步氮采。

卡頓產(chǎn)生的原因和解決方案
ios_frame_drop.png

在 VSync 信號到來后,系統(tǒng)圖形服務(wù)會通過 CADisplayLink 等機(jī)制通知 App鹊漠,App 主線程開始在 CPU 中計算顯示內(nèi)容主到,比如視圖的創(chuàng)建躯概、布局計算登钥、圖片解碼娶靡、文本繪制等牧牢。隨后 CPU 會將計算好的內(nèi)容提交到 GPU 去,由 GPU 進(jìn)行變換姿锭、合成塔鳍、渲染呻此。隨后 GPU 會把渲染結(jié)果提交到幀緩沖區(qū)去轮纫,等待下一次 VSync 信號到來時顯示到屏幕上焚鲜。由于垂直同步的機(jī)制掌唾,如果在一個 VSync 時間內(nèi),CPU 或者 GPU 沒有完成內(nèi)容提交忿磅,則那一幀就會被丟棄糯彬,等待下一次機(jī)會再顯示,而這時顯示屏?xí)A糁暗膬?nèi)容不變葱她。這就是界面卡頓的原因。

從上面的圖中可以看到吨些,CPU 和 GPU 不論哪個阻礙了顯示流程,都會造成掉幀現(xiàn)象锤灿。所以開發(fā)時,也需要分別對 CPU 和 GPU 壓力進(jìn)行評估和優(yōu)化但校。


綜上所述,實(shí)際項目中状囱,一般可以將布局信息提前計算好并緩存,滑動tableview的時候盡量減少cpu計算布局信息的使用亭枷。

更多優(yōu)化方法請移步
iOS 保持界面流暢的技巧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叨粘,隨后出現(xiàn)的幾起案子瘤睹,更是在濱河造成了極大的恐慌,老刑警劉巖轰传,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪撇,死亡現(xiàn)場離奇詭異获茬,居然都是意外死亡倔既,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門渤涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歼捏,你說我怎么就攤上這事⊥啵” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵袖迎,是天一觀的道長。 經(jīng)常有香客問我腺晾,道長燕锥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任归形,我火速辦了婚禮鼻由,結(jié)果婚禮上暇榴,老公的妹妹穿的比我還像新娘蕉世。我一直安慰自己,他們只是感情好狠轻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著查吊,像睡著了一般谐区。 火紅的嫁衣襯著肌膚如雪菩貌。 梳的紋絲不亂的頭發(fā)上卢佣,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天箭阶,我揣著相機(jī)與錄音戈鲁,去河邊找鬼。 笑死婆殿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婆芦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼肠鲫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了导饲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤渣锦,失蹤者是張志新(化名)和其女友劉穎氢哮,沒想到半個月后袋毙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冗尤,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年媳溺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悬蔽。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捉兴,死狀恐怖蝎困,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禾乘,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布始藕,位于F島的核電站,受9級特大地震影響伍派,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诉植,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望舌稀。 院中可真熱鬧,春花似錦灼擂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫉到。三九已至,卻和暖如春何恶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背细层。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工唬涧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疫赎,地道東北人碎节。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胎撇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容