iOS - 界面優(yōu)化

APP的界面優(yōu)化

什么樣的界面讓你覺得需要被優(yōu)化呢绝编?
就是界面會(huì)卡頓咯驾窟。

下面介紹

  1. 卡頓原理
  2. 卡頓檢測(cè)
  3. 實(shí)戰(zhàn)

1踩萎、界面為什么會(huì)卡頓呢

  • 先要來(lái)說(shuō)說(shuō)計(jì)算機(jī)顯示的過(guò)程缕粹,界面的顯示是通過(guò)CPUGPU拷邢、顯示器協(xié)同工作袱院,最終將圖片顯示到屏幕

  • 圖像 -> CPU將圖片解碼,交給GPU -> GPU進(jìn)行圖像的渲染 -> 存儲(chǔ)到到幀緩存區(qū) -> 視頻控制器進(jìn)行讀取幀緩存區(qū)信息瞭稼,并刷新部件(視頻控制器只是負(fù)責(zé)幀緩存區(qū)與顯示器的對(duì)應(yīng)關(guān)系) -> 顯示器逐行掃描顯示忽洛。

在最初的時(shí)候,F(xiàn)rameBuffer只有一個(gè)环肘,但只有一個(gè)緩沖區(qū)會(huì)屏幕會(huì)很大概率出現(xiàn)問(wèn)題欲虚,為了解決效率問(wèn)題就引入了雙緩沖區(qū)

  • 雙緩沖區(qū)是在幀緩存區(qū)中開辟兩個(gè)緩沖區(qū)悔雹,一個(gè)緩沖區(qū)通過(guò)視頻控制器進(jìn)行當(dāng)前幀數(shù)據(jù)的讀取顯示复哆,另一個(gè)緩沖區(qū)進(jìn)行接收下一幀GPU渲染的圖像。

但這樣又會(huì)出現(xiàn)一個(gè)問(wèn)題腌零,畫面撕裂梯找,就是顯卡的輸出幀速度大于顯示器的速度,在顯示器處理顯卡一幀的過(guò)程中益涧,顯卡又把處理好的第二幀丟了過(guò)來(lái)初肉,造成了畫面撕裂。為了解決這個(gè)問(wèn)題,采用了垂直同步信號(hào)牙咏。

  • 垂直同步又稱場(chǎng)同步(Vertical synchronization),從CRT顯示器的顯示原理來(lái)看嘹裂,單個(gè)像素組成了水平掃描線妄壶,水平掃描線在垂直方向的堆積形成了完整的畫面。顯示器的刷新率受顯卡DAC控制寄狼,顯卡DAC完成一幀的掃描后就會(huì)產(chǎn)生一個(gè)垂直同步信號(hào)丁寄。
簡(jiǎn)而言之:垂直同步就是加鎖,在當(dāng)前讀取的幀數(shù)據(jù)結(jié)束之前泊愧,不會(huì)讀取下一幀的數(shù)據(jù)伊磺。

在這之后出現(xiàn)的問(wèn)題就是卡頓了

  • 第一幀顯示完成后垂直信號(hào)發(fā)出信號(hào)讓視頻控制器指向另一個(gè)幀緩沖區(qū)時(shí),第二幀還在處理中删咱,因此顯示器還在顯示第一幀(掉幀)屑埋,下一幀處理完成后直接顯示下一幀。這就是出現(xiàn)卡頓的原因痰滋。

為了避免出現(xiàn)卡頓摘能,我們需要對(duì)卡頓進(jìn)行監(jiān)測(cè)

2、卡頓監(jiān)測(cè)

一般分為兩類:

2.1敲街、FPS
  • FPS:通過(guò)CADisplayLink來(lái)計(jì)算刷新時(shí)間頻率团搞。應(yīng)用的刷新頻率應(yīng)保持60fps左右,那么1次刷新間隔就是1000ms/60 = 16.67ms多艇,所以在16.67ms內(nèi)沒(méi)有準(zhǔn)備好下一幀逻恐,就會(huì)造成卡頓

  • FPS主要是通過(guò)CADisplayLink實(shí)現(xiàn)的,用時(shí)間差來(lái)計(jì)算每次的刷新時(shí)間從而得到刷新頻率峻黍。

2.1复隆、主線程卡頓監(jiān)測(cè)
  • 主線程卡頓監(jiān)測(cè):通過(guò)子線程去監(jiān)測(cè)主線程RunLoop,從任務(wù)開始(kCFRunLoopBeforeSources)任務(wù)結(jié)束(kCFRunLoopAfterWaiting)間的耗時(shí)奸披,過(guò)長(zhǎng)時(shí)基本上就認(rèn)為可能有卡頓了昏名。

卡頓檢測(cè)第三方庫(kù)
swift:ANREye

OC:微信matrix滴滴DoraemonKit

3阵面、界面優(yōu)化

--CPU層面--

3. 1轻局、預(yù)排版

預(yù)排版提前計(jì)算布局,如cell的高度样刷,(提前計(jì)算仑扑,后面直接使用)

我們可以單獨(dú)在一個(gè)預(yù)排版的子線程去做一些事情:

  • frame的計(jì)算
  • 控件層級(jí)的部署
  • 渲染所需數(shù)據(jù)的處理
  • Model模型的數(shù)據(jù)解析等

盡量提前計(jì)算好布局,在需要時(shí)一次性調(diào)整好對(duì)應(yīng)屬性置鼻,而不要多次镇饮、頻繁的計(jì)算和調(diào)整這些屬性。

3. 2箕母、Autolayout

Autolayout在大部分情況下也能很好的提升開發(fā)效率储藐,但是Autolayout對(duì)于復(fù)雜視圖來(lái)說(shuō)常常會(huì)產(chǎn)生嚴(yán)重的性能問(wèn)題俱济。隨著視圖數(shù)量的增長(zhǎng),Autolayout 帶來(lái)的 CPU 消耗會(huì)呈指數(shù)級(jí)上升钙勃。

所以復(fù)雜的頁(yè)面最好使用純代碼來(lái)布局蛛碌。

3. 3、預(yù)解碼 & 預(yù)渲染

3. 4辖源、對(duì)象創(chuàng)建蔚携、調(diào)整、銷毀

  • 對(duì)象創(chuàng)建:盡量做到懶加載克饶。不用的對(duì)象不進(jìn)行創(chuàng)建酝蜒;

    • 若視圖不需要響應(yīng)事件,用 CALayer 顯示矾湃。CALayer 比 UIView更輕量級(jí)亡脑。
  • 對(duì)象調(diào)整:減少對(duì)UIViewCALayer屬性修改

    • 對(duì)CALayer屬性修改,實(shí)際上是運(yùn)行時(shí)resolveInstanceMethod為對(duì)象臨時(shí)添加一個(gè)方法洲尊,把對(duì)應(yīng)的屬性存儲(chǔ)到內(nèi)部的Dictionary中远豺,并通知delegate、完成調(diào)整等等坞嘀,非常耗時(shí)躯护。

    • 對(duì)UIView屬性修改(如frame、bounds丽涩、transform等)棺滞,實(shí)際是從CALayer映射的,所以修改UIView的資源消耗更加大矢渊。

  • 對(duì)象銷毀:有大量對(duì)象釋放時(shí)继准,是非常耗時(shí)的,盡量挪到子線程去釋放

3. 4矮男、文本處理

  • 1移必、對(duì)文本沒(méi)有特殊需求的話,可以使用UILabel的內(nèi)部方法來(lái)進(jìn)行計(jì)算毡鉴,需要放到子線程中崔泵,防止主線程被阻塞

    • 計(jì)算文本寬高:[NSAttributedString boundingRectWithSize:options:context:]

    • 文本繪制:[NSAttributedString drawWithRect:options:context:]

  • 2、自定義文本控件猪瞬,可以使用TextKit 或最底層的 CoreText 對(duì)文本異步繪制憎瘸。

    • 使用CoreText對(duì)象創(chuàng)建好后,能直接獲取文本的寬高等信息陈瘦,避免了多次計(jì)算(調(diào)整和繪制都需要計(jì)算一次)幌甘。CoreText直接使用了CoreGraphics占用內(nèi)存小,效率高

3. 4、圖片處理

  • 1锅风、 UIImage 或者 CGImageSource 的方法創(chuàng)建圖片時(shí)酥诽,圖片不會(huì)馬上開始解碼,而是當(dāng)圖片設(shè)置到 UIImageView 或者 CALayer.contents 上皱埠,且 CALayer 被提交到 GPU 前盆均,CGImage 中的數(shù)據(jù)才會(huì)得到解碼。這一步是發(fā)生在主線程的漱逸,并且不可避免。如果想要繞開這個(gè)機(jī)制游沿,常見的做法是在后臺(tái)線程先把圖片繪制到 CGBitmapContext 中饰抒,然后從 Bitmap 直接創(chuàng)建圖片。如SDWebImage三方框架中對(duì)圖片編解碼的處理诀黍。這就是Image的預(yù)解碼

  • 2袋坑、可以將圖像的繪制在子線程中進(jìn)行

3. 5、小處理

  • 避免使用透明view

  • 避免使用addViewcell動(dòng)態(tài)添加view

  • 按需加載眯勾,例如在TableView中滑動(dòng)時(shí)不加載圖片枣宫,使用默認(rèn)占位圖,而是在滑動(dòng)停止時(shí)加載

  • 盡量使用PNG圖片吃环,不使用JPGE圖片

--GPU層面--

GPU能干的事情比較單一也颤;接收提交的紋理(Texture)和頂點(diǎn)描述(三角形),應(yīng)用變換(transform)郁轻、混合并渲染翅娶,然后輸出到屏幕上。通常你所能看到的內(nèi)容好唯,主要也就是紋理(圖片)和形狀(三角模擬的矢量圖形)兩類竭沫。

  • 1、盡量將多張圖合為一張進(jìn)行顯示

  • 2骑篙、盡量減少視圖數(shù)量和層次

  • 3蜕提、離屏渲染:CALayer的border、圓角靶端、陰影谎势、遮罩(mask),最徹底的解決辦法躲查,就是把需要顯示的圖形在后臺(tái)線程繪制為圖片它浅,避免使用圓角、陰影镣煮、遮罩等屬性姐霍。

  • 4、異步渲染:參考Graver

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市镊折,隨后出現(xiàn)的幾起案子胯府,更是在濱河造成了極大的恐慌,老刑警劉巖恨胚,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骂因,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赃泡,警方通過(guò)查閱死者的電腦和手機(jī)寒波,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)升熊,“玉大人俄烁,你說(shuō)我怎么就攤上這事〖兑埃” “怎么了页屠?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蓖柔。 經(jīng)常有香客問(wèn)我辰企,道長(zhǎng),這世上最難降的妖魔是什么况鸣? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任牢贸,我火速辦了婚禮,結(jié)果婚禮上懒闷,老公的妹妹穿的比我還像新娘十减。我一直安慰自己,他們只是感情好愤估,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布帮辟。 她就那樣靜靜地躺著,像睡著了一般玩焰。 火紅的嫁衣襯著肌膚如雪由驹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天昔园,我揣著相機(jī)與錄音蔓榄,去河邊找鬼。 笑死默刚,一個(gè)胖子當(dāng)著我的面吹牛甥郑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荤西,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼澜搅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伍俘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起勉躺,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤癌瘾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饵溅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妨退,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜕企,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咬荷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轻掩,死狀恐怖萍丐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情放典,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布基茵,位于F島的核電站奋构,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拱层。R本人自食惡果不足惜弥臼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望根灯。 院中可真熱鬧径缅,春花似錦、人聲如沸烙肺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桃笙。三九已至氏堤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搏明,已是汗流浹背鼠锈。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留星著,地道東北人购笆。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虚循,于是被迫代替她去往敵國(guó)和親同欠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子样傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 資料來(lái)源iOS 保持界面流暢的技巧[https://blog.ibireme.com/2015/11/12/smo...
    Mjs閱讀 609評(píng)論 1 0
  • 本文內(nèi)容是參考文章:http://www.cocoachina.com/ios/20151130/14477.ht...
    東也_閱讀 1,252評(píng)論 0 4
  • 本文主要介紹界面卡頓的原理以及優(yōu)化 界面卡頓 通常來(lái)說(shuō)铭乾,計(jì)算機(jī)中的顯示過(guò)程是下面這樣的,通過(guò)CPU娃循、GPU炕檩、顯示器...
    輝輝歲月閱讀 231評(píng)論 0 0
  • 轉(zhuǎn)載自:iOS 保持界面流暢的技巧 屏幕顯示圖像的原理 卡頓產(chǎn)生的原因和解決方案 從上面的圖中可以看到,CPU 和...
    荒漠現(xiàn)甘泉閱讀 1,541評(píng)論 0 0
  • 卡頓原因 計(jì)算機(jī)通過(guò)CPU捌斧、GPU笛质、顯示器三者協(xié)同工作將試圖顯示到屏幕上 1、CPU將需要顯示的內(nèi)容計(jì)算出來(lái)捞蚂,提交...
    木揚(yáng)音閱讀 682評(píng)論 0 8