iOS性能優(yōu)化--列表流暢度

如此高強度的項目壓力下茅信,爭取一個月寫一篇吧屹徘。之后估計會出一個基礎(chǔ)補完系列捍靠,爭取一個星期更一篇沐旨。此文章只是用來記錄自己的學(xué)習(xí)過程,如有錯誤歡迎指正榨婆。

概述

在iOS中隨處可見各種列表磁携,如聊天列表,評論列表良风,視頻列表等谊迄。用高端機跑一些內(nèi)容簡單的列表是不會感覺到任何的卡頓的。但在低端機上面烟央,大廠和小作坊的列表流暢度的差距就顯現(xiàn)出來了统诺,優(yōu)秀的代碼在低端機上允許也如同高端機一樣絲滑。

卡頓產(chǎn)生的原因

你可以理解為系統(tǒng)會定時向App發(fā)送一個信號疑俭,在顯示之前粮呢,App主線程會在CPU中計算顯示內(nèi)容,比如視圖的創(chuàng)建、布局計算啄寡、圖片解碼豪硅、文本繪制等。隨后 CPU 會將計算好的內(nèi)容提交到 GPU 去挺物,由 GPU 進行變換懒浮、合成、渲染姻乓。隨后 GPU 會把渲染結(jié)果提交到幀緩沖區(qū)去嵌溢,當(dāng)信號到來的時候,如果幀緩沖區(qū)沒有東西蹋岩,根據(jù)垂直同步,這一幀會被丟棄学少,等待下一次機會再顯示剪个,而這時屏幕會顯示與之前相同的內(nèi)容,從而造成了視覺上的卡頓版确。

那么無論是CPU還是GPU出現(xiàn)了問題 只要最終的結(jié)果沒有渲染完成就會造成界面卡頓扣囊。所以開發(fā)的時候要同事兼顧CPU和GPU。

優(yōu)化方案

既然知道CPU和GPU都有造成卡頓的可能绒疗,那么優(yōu)化方案都是針對于CPU和GPU 減少計算時間侵歇,不讓某一時間計算量暴增,避免一方爆炸一方很閑的情況吓蘑,這些優(yōu)化方案都是可行的惕虑。CPU消耗時間主要在:對象創(chuàng)建、對象調(diào)整磨镶、對象銷毀溃蔫、布局計算、自動布局琳猫、文本計算伟叛、圖片的解碼。GPU耗時主要在:紋理的渲染脐嫂、視圖的混合 统刮、圖形的生成。針對這幾個方面進行優(yōu)化账千,能大大提高列表的流暢度侥蒙。

避免離屏渲染

在iOS中離屏渲染好像被提及的比較多,其原理可以百度蕊爵,因為我也是百度知道的辉哥,我就不CV了,簡而言之就是GPU新開辟了一塊內(nèi)存供CPU渲染,這是一種時間換空間的策略醋旦。離屏渲染的整個過程恒水,需要多次切換上下文環(huán)境;等到離屏渲染結(jié)束以后饲齐,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上有需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕钉凌。而上下文環(huán)境的切換是要付出很大代價的。

如何避免離屏渲染

  1. 避免設(shè)置layer的mask layer.mask
  2. 避免設(shè)置圖層的投影 layer.shadow
  3. 圖層的光柵化layer.ShouldRasterize
  4. 圖層不為一層時 layer.maskToBounds = true

預(yù)排版

當(dāng)我們從接口取得數(shù)據(jù)時捂人,我們就應(yīng)該計算出顯示內(nèi)容所需的高度并存儲起來御雕,視圖布局的計算是CPU最耗時的地方,多次對frame滥搭、bounds進行調(diào)整非常消耗資源酸纲,因此,提前計算好最終布局瑟匆,然后一次調(diào)整闽坡,而不是頻繁調(diào)整這些屬性。自動布局也是在顯示前計算愁溜,而不是提前計算完成疾嗅,對于復(fù)雜視圖來說常常會產(chǎn)生嚴(yán)重的性能問題。

避免圖層混合

我們開發(fā)中為了實現(xiàn)某種效果冕象,常將圖層像畫布一樣一層層疊起來代承,這樣GPU需要一層層繪制,消耗了大量資源渐扮,為了減少GPU資源消耗论悴,應(yīng)將多層圖層合成一層來顯示,并適當(dāng)?shù)臏p少視圖層數(shù)和和數(shù)量席爽,并在不透明的視圖中標(biāo)明opaque屬性以避免無用的Alpha通道合成意荤。比如如果UIlabel的背景為純色的話,應(yīng)該給UIlabel設(shè)置背景色來避免圖層混合只锻。

更高效的異步圖片加載

優(yōu)秀的異步加載圖片庫 SDWebImage 已經(jīng)可以滿足大部分需求了玖像,將圖片全部存在內(nèi)存中并加上動畫可以避免異步加載時圖片閃白。另外注意在顯示圖片的時候要避免圖片被拉伸或被壓縮齐饮,這在一定程度上也會造成性能的消耗捐寥。

寫在后面的話

所有的優(yōu)化都是為了提高CPU和GPU的計算速度的,所謂的優(yōu)化就是在壓榨硬件性能祖驱,但是硬件性能也有極限握恳。產(chǎn)品總不可能讓你在黑白電視上播彩色電影吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捺僻,一起剝皮案震驚了整個濱河市乡洼,隨后出現(xiàn)的幾起案子崇裁,更是在濱河造成了極大的恐慌,老刑警劉巖束昵,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔稳,死亡現(xiàn)場離奇詭異,居然都是意外死亡锹雏,警方通過查閱死者的電腦和手機巴比,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礁遵,“玉大人轻绞,你說我怎么就攤上這事∮赌停” “怎么了政勃?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兼砖。 經(jīng)常有香客問我稼病,道長,這世上最難降的妖魔是什么掖鱼? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮援制,結(jié)果婚禮上戏挡,老公的妹妹穿的比我還像新娘。我一直安慰自己晨仑,他們只是感情好褐墅,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洪己,像睡著了一般妥凳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上答捕,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天逝钥,我揣著相機與錄音,去河邊找鬼拱镐。 笑死艘款,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沃琅。 我是一名探鬼主播哗咆,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼益眉!你這毒婦竟也來了晌柬?” 一聲冷哼從身側(cè)響起姥份,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎年碘,沒想到半個月后澈歉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡盛泡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年闷祥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傲诵。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡凯砍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拴竹,到底是詐尸還是另有隱情悟衩,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布栓拜,位于F島的核電站座泳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幕与。R本人自食惡果不足惜挑势,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啦鸣。 院中可真熱鬧潮饱,春花似錦、人聲如沸诫给。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽中狂。三九已至凫碌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胃榕,已是汗流浹背盛险。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勤晚,地道東北人枉层。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像赐写,于是被迫代替她去往敵國和親鸟蜡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355