【Objective-c】 性能優(yōu)化_TableView優(yōu)化

UITableView 在移動(dòng)開發(fā)中常常是必不可少的今膊,并且是動(dòng)態(tài)的加載季二,要很好的滾動(dòng)顯示效果谷徙,就必須更多的了解UITableView的實(shí)現(xiàn)機(jī)制拒啰,更好的優(yōu)化。
UITableView的優(yōu)化分兩塊:布局優(yōu)化完慧、渲染優(yōu)化图呢、異步操作。(也可以理解為平衡CPU和GPU的負(fù)載骗随,這就要理解為什么會(huì)造成卡頓的原因了)

一蛤织、布局優(yōu)化
布局優(yōu)化包括:布局優(yōu)化和高度優(yōu)化
1、布局有兩種方式鸿染,第一種是AutoLayout(storyboard指蚜、xib或Masonry),第二種是frame涨椒。使用AutoLayout布局的話可以省去人工計(jì)算成本和靈活多變摊鸡,相對(duì)的就會(huì)增加CPU的負(fù)載,而使用frame對(duì)CPU來說就很簡(jiǎn)單蚕冬,唯一的缺點(diǎn)就是可擴(kuò)展性差免猾。以下是引用Draveness的一張圖,展示兩種布局的性能差別

Paste_Image.png

補(bǔ)充:
(1)在開發(fā)的過程中囤热,本人會(huì)優(yōu)先考慮使用AutoLayout的方式猎提,原因有兩個(gè):第一,AutoLayout布局容易且快旁蔼,在開發(fā)中優(yōu)先考慮就是完成功能锨苏;第二是現(xiàn)在的手機(jī)硬件越來越好,性能堪比電腦棺聊,如果不是特別復(fù)制的界面一般TableView滑動(dòng)的流暢度都是沒問題的伞租。
(2)Frame布局方式页藻,這里特別推薦Yang2333的文章憋沿,他的實(shí)現(xiàn)方式挺新穎的,并且對(duì)于tableView的優(yōu)化方式也是信息量滿滿的

2劲适、高度優(yōu)化
UITableView是UIScrollView的子類祟同,所以也是要計(jì)算其ContentSize,UITableView的contentSize的高度是全部Cell的高度和作喘。設(shè)置UITableView的高度有兩種方式
第一種是直接設(shè)置tableView的屬性rowHeight(這種方式只適合設(shè)置固定高度的Cell,并且也是設(shè)置固定高度的推薦方式)耐亏;
第二種是通過代理方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath.
因?yàn)閁ITableView 實(shí)現(xiàn)機(jī)制的原因徊都,每顯示一個(gè)Cell都需要執(zhí)行N次這個(gè)方法(并且包括顯示在屏幕或還沒顯示的),如果在這個(gè)方法中添加計(jì)算Cell的復(fù)雜算法广辰,可想而知這對(duì)CPU而言是非常重的負(fù)擔(dān)暇矫。優(yōu)化的方向是怎么獲取Cell的高度并減少計(jì)算的難度。
本人的做法:關(guān)于UITableView布局的優(yōu)化择吊,一直都是在使用Masonry和UITableView+FDTemplateLayoutCell兩個(gè)框架李根,對(duì)于一般的項(xiàng)目來說都是沒什么問題的。
UITableView+FDTemplateLayoutCell優(yōu)化原理

補(bǔ)充:
對(duì)于不是固定高度的Cell几睛,這里還有一個(gè)小技巧房轿,對(duì)提高UITableView的流暢度很有幫助的。
在tableView:cellForRowAtIndexPath: 方法中需要為每一個(gè)Cell 調(diào)用一次,它應(yīng)該快速執(zhí)行囱持,要盡可能塊的返回重用Cell實(shí)例夯接。Cell還沒顯示到屏幕上,不再這里執(zhí)行數(shù)據(jù)綁定
tableView:willDisplayCell:forRowAtIndexPath: 在Cell要顯示時(shí)調(diào)用纷妆,在這里執(zhí)行數(shù)據(jù)綁定

補(bǔ)充設(shè)置圓角的正確姿勢(shì):bestswifter


二盔几、渲染優(yōu)化
講渲染優(yōu)化這里有幾個(gè)概念需要先提的:混合操作、離屏渲染掩幢,像素對(duì)齊逊拍。
混合操作
渲染最慢的操作之一,是由GPU完成际邻,我們的目的就是減少混合操作的次數(shù)芯丧。
查看混合操作的方式如下圖

Paste_Image.png
Paste_Image.png

離屏渲染
iOS-離屏渲染詳解
離屏渲染優(yōu)化詳解:實(shí)例示范+性能測(cè)試
關(guān)于離屏渲染上面兩篇文章已經(jīng)寫得很詳細(xì)了,這里再推薦一種查看離屏渲染的調(diào)試技巧世曾,如下圖

Paste_Image.png
Paste_Image.png

像素對(duì)齊
有了Retain屏后缨恒,CocoTouch環(huán)境下,可以使用屏幕點(diǎn)來取代像素了度硝,并且屏幕點(diǎn)可以是浮點(diǎn)值肿轨,
當(dāng)屏幕點(diǎn)是浮點(diǎn)數(shù)時(shí),iOS 將會(huì)執(zhí)行子像素渲染蕊程,這技術(shù)在特定類型的內(nèi)容(如文本)時(shí)很有意義椒袍,但是當(dāng)繪制
平滑直線時(shí)則沒有必要了,這會(huì)讓iOS 執(zhí)行一些不必要的任務(wù)藻茂,從而降低FPS
查看方式:在iOS模擬器上運(yùn)行程序驹暑,在”Debug“菜單中選中”Color Misaligned Image“。
有兩種高亮區(qū)域:品紅色區(qū)域會(huì)執(zhí)行子像素渲染辨赐,而黃色區(qū)域是圖片大小沒有對(duì)齊的情況优俘。
建議:對(duì)所有像素相關(guān)的數(shù)據(jù)做四舍五入處理,包括點(diǎn)坐標(biāo)掀序,UIView的高度和寬度帆焕。
跟蹤你的圖像資源:圖片必須是像素完美的,否則在Retina屏幕上渲染時(shí)不恭,它會(huì)做不必要的抗鋸齒處理叶雹。

還有一個(gè)是opaque值,opaque是一個(gè)渲染性能的開關(guān)標(biāo)識(shí)符换吧,并不代表視圖的透明度(aphal 才是視圖的透明度屬性值)折晦,opaque默認(rèn)值是YES,如果opaque的值為NO沾瓦,則是合成渲染满着,加大了GPU合成計(jì)算視圖顯示的計(jì)算難度谦炒。

第三:異步操作
異步操作主要是為了盡快返回Cell,通常是異步操作讀寫數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)請(qǐng)求风喇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宁改,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子响驴,更是在濱河造成了極大的恐慌透且,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豁鲤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鲸沮,警方通過查閱死者的電腦和手機(jī)琳骡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讼溺,“玉大人楣号,你說我怎么就攤上這事∨鳎” “怎么了炫狱?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)剔猿。 經(jīng)常有香客問我视译,道長(zhǎng),這世上最難降的妖魔是什么归敬? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任酷含,我火速辦了婚禮,結(jié)果婚禮上汪茧,老公的妹妹穿的比我還像新娘椅亚。我一直安慰自己,他們只是感情好舱污,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布呀舔。 她就那樣靜靜地躺著,像睡著了一般扩灯。 火紅的嫁衣襯著肌膚如雪媚赖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天驴剔,我揣著相機(jī)與錄音省古,去河邊找鬼。 笑死丧失,一個(gè)胖子當(dāng)著我的面吹牛豺妓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琳拭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼训堆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起白嘁,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤坑鱼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后絮缅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲁沥,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年耕魄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了画恰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吸奴,死狀恐怖允扇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情则奥,我是刑警寧澤考润,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站读处,受9級(jí)特大地震影響糊治,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜档泽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一俊戳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馆匿,春花似錦抑胎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赃蛛,卻和暖如春恃锉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呕臂。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工破托, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歧蒋。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓土砂,卻偏偏與公主長(zhǎng)得像州既,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萝映,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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