iOS:tableView優(yōu)化知多少

優(yōu)化的本質(zhì)

就是提高滾動的性能并減少內(nèi)存的使用,以保證流暢性蜓竹,本質(zhì)上就是降低CPU和GPU花費(fèi)的時間。

CPU:對象的創(chuàng)建和銷毀储藐、對象屬性的調(diào)整俱济、頁面布局、文本的計(jì)算和排版钙勃、圖片的格式轉(zhuǎn)換和編碼解碼蛛碌、圖像的繪制等。

GPU:頂點(diǎn)著色(對位圖bitmap處理)辖源、圖元裝配 蔚携、光柵化、片段著色克饶、片段處理酝蜒,這些提交到緩沖區(qū)中frameBuffer

設(shè)備的屏幕刷新率大概是60幀每秒,一幀約16.7毫秒矾湃,當(dāng)下一幀已經(jīng)到來的時候亡脑,當(dāng)前幀CPU、GPU的工作還沒有完成邀跃,就會感覺到卡頓霉咨。

優(yōu)化方案

CPU層

1、使用輕量級對象

用不到事件處理的view使用CALayer拍屑,UIView中也有CALayer屬性途戒,他們的本質(zhì)區(qū)別在于是否能響應(yīng)事件。CALayer更接近底層的渲染丽涩,直接使用CALayer可以減少一些UIView帶來的額外計(jì)算棺滞。

2、cell重用機(jī)制

注冊重用標(biāo)識符矢渊,等待使用隊(duì)列、使用中的隊(duì)列
初始化生成最初的使用中的cell枉证,并分配重用標(biāo)識符矮男。
滾動時,不可見的cell移除屏幕室谚,進(jìn)入到等待使用的隊(duì)列中(重用池)毡鉴。
當(dāng)新的cell要在屏幕中顯示時崔泵,先dequeueReusableCellWithIdentifier根據(jù)標(biāo)識符獲取一個可重用的(先在重用池中查找,有直接返回猪瞬,沒有新建憎瘸,并添加到使用中的隊(duì)列中)
獲取到cell后,根據(jù)數(shù)據(jù)更新cell

3陈瘦、避免cell重新布局

cell布局填充等操作是比較費(fèi)時的幌甘,一般創(chuàng)建的時候就把相關(guān)控件添加好,根據(jù)顯示/隱藏更新cell

減少cell中控件數(shù)量和層級痊项,若有樣式區(qū)別很大锅风,創(chuàng)建不同的cell

4、不在cellForRowAtIndexPath方法中做耗時操作

耗時操作有:
讀/寫文件鞍泉、cell執(zhí)行addSubview添加view皱埠、數(shù)據(jù)處理等。

滑動過程中咖驮,這個方法會不停的被調(diào)用边器。

5、提前計(jì)算好布局

如果是高度固定的托修,直接設(shè)置rowHeight屬性效率更高饰抒,因?yàn)闆]有詢問代理的過程。注意:若設(shè)置代理返回告訴诀黍,設(shè)置rowHeight將無效袋坑。

如果高度不固定,使用estimatedRowHeight預(yù)估一個高度并配合autolayout實(shí)現(xiàn)正常顯示cell的目的眯勾。

根據(jù)tableview的方法執(zhí)行順序以此是:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

可以在willDisplayCell方法中緩存行高枣宫,heightForRowAtIndexPath中做出判斷
??:數(shù)據(jù)源更新時,記得更新緩存的高度

有一個緩存行高很不錯的開源庫

FDTemplateLayoutCell 相關(guān)詳情可以參考Tableview高度計(jì)算那些事

使用runloop實(shí)現(xiàn)空閑時間執(zhí)行預(yù)緩存(提前把未顯示出的cell高度緩存下來)

6吃环、圖片尺寸合適

圖片的size和UIImageView的size保持一致也颤,圖片通過contentMode處理顯示對tablView頻繁滾動還是會造成一定的影響。

網(wǎng)絡(luò)下載的圖片根據(jù)要顯示的圖片大小壓縮成合適大小的圖郁轻,每次只顯示處理過大小的圖翅娶,服務(wù)器處理好圖片

/// 根據(jù)指定frame裁剪image
+ (UIImage *)hf_cutImage:(UIImage *)origalImage frame:(CGRect)cropRect {
    CGImageRef tmp = CGImageCreateWithImageInRect([origalImage CGImage], cropRect);
    UIImage *resultImage = [UIImage imageWithCGImage:tmp scale:origalImage.scale orientation:origalImage.imageOrientation];
    CGImageRelease(tmp);
    return resultImage;
}

7、子線程處理耗時操作

文本處理(尺寸計(jì)算好唯、繪制等)

圖片處理(解碼竭沫、繪制等)

GPU層

1、減少視圖數(shù)量骑篙、層級和混合操作

當(dāng)多個視圖疊加蜕提,放在上面的視圖是半透明的時候,GPU就會進(jìn)行混合靶端,把透明的顏色放在下面的視圖的顏色谎势,混合之后得出一個顏色再顯示在屏幕上凛膏,會增加GPU的消耗。

UIView的背景色不要設(shè)置clearColor脏榆,圖片避免使用帶alpha通道的圖片猖毫。

2、盡量避免離屏渲染

光柵化须喂,layer.shouldRasterize = YES;
遮罩吁断,layer.mask;
圓角镊折,同時設(shè)置layer.masksToBouns = YES 和layer.cornerRadius>0;
陰影胯府,layer.shadow;
透明度,layer.allowsGroupOpacity = YES和layer.opacity<1
重寫drawRect方法

優(yōu)化:
1恨胚、使用貝塞爾曲線配合Core Graphics框架繪制圓角或使用圓角圖片作為中間層
2骂因、設(shè)置shadowPath指定陰影效果路徑,減少視圖輪廓計(jì)算
3赃泡、異步進(jìn)行l(wèi)ayer渲染

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寒波,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子升熊,更是在濱河造成了極大的恐慌俄烁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件级野,死亡現(xiàn)場離奇詭異页屠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蓖柔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門辰企,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人况鸣,你說我怎么就攤上這事牢贸。” “怎么了镐捧?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵潜索,是天一觀的道長。 經(jīng)常有香客問我懂酱,道長竹习,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任玩焰,我火速辦了婚禮由驹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昔园。我一直安慰自己蔓榄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布默刚。 她就那樣靜靜地躺著甥郑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荤西。 梳的紋絲不亂的頭發(fā)上澜搅,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音邪锌,去河邊找鬼勉躺。 笑死,一個胖子當(dāng)著我的面吹牛觅丰,可吹牛的內(nèi)容都是我干的饵溅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妇萄,長吁一口氣:“原來是場噩夢啊……” “哼蜕企!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冠句,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤轻掩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后懦底,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唇牧,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年聚唐,在試婚紗的時候發(fā)現(xiàn)自己被綠了丐重。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡拱层,死狀恐怖弥臼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情根灯,我是刑警寧澤径缅,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站烙肺,受9級特大地震影響纳猪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桃笙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一氏堤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦鼠锈、人聲如沸闪檬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粗悯。三九已至,卻和暖如春同欠,著一層夾襖步出監(jiān)牢的瞬間样傍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工铺遂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衫哥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓襟锐,卻偏偏與公主長得像撤逢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捌斧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350