《iOS UITableView 優(yōu)化》 直播筆記

今天回顧了下這個(gè)直播 優(yōu)化TableView滑動(dòng)體驗(yàn)阱佛,其中前面講的影響性能的點(diǎn)的印象比較深刻,特此記錄耍缴。

  • 一砾肺、較多出現(xiàn)影響性能的點(diǎn)
  • 二、額外想到之前看到的點(diǎn)
  • 三私恬、對(duì)某些的擴(kuò)展
一债沮、影響性能的點(diǎn)

主線程干了與繪制無關(guān)的事情炼吴,凡是耗時(shí)的都有影響本鸣。當(dāng)然把復(fù)雜的事情放到異步線程中去,假如計(jì)算時(shí)間比較久時(shí)硅蹦,滑動(dòng)時(shí)也可能出現(xiàn)空白的情況荣德,也是很不爽的。

  • 1童芹、大量的對(duì)象的創(chuàng)建和銷毀涮瞻,過多的時(shí)候肯定是有影響,這個(gè)無須多說假褪。
  • 2署咽、文本的計(jì)算多的話,放在主線程肯定就有影響生音。很多時(shí)候我們可以都把那個(gè)計(jì)算提前算出來宁否。
  • 3、服務(wù)器下發(fā)的圖片和實(shí)際的尺寸不一致缀遍,不得不去手動(dòng)改尺寸慕匠,而重新計(jì)算尺寸就是有影響性能的。
  • 4域醇、重復(fù)去讀圖片台谊,可以采取緩存的方法去避免重復(fù)蓉媳。
  • 5、設(shè)置圓角锅铅。其實(shí)單純的設(shè)置圓角很簡單酪呻,它不會(huì)帶來任何性能損耗
view.layer.cornerRadius = 10.0f;

因?yàn)樵谀J(rèn)情況下盐须,這個(gè)屬性只會(huì)影響視圖的背景顏色和 border号杠。而是我們加上

label.layer.cornerRadius = 10.0f;
label.layer.masksToBounds = true;

也就是說設(shè)置 masksToBounds才會(huì)導(dǎo)致離屏渲染丰歌,從而影響性能的姨蟋。具體可以看看iOS 高效添加圓角效果實(shí)戰(zhàn)講解

  • 6立帖、cell 不復(fù)用眼溶,這個(gè)基本不會(huì)用到,我們現(xiàn)在一般都會(huì)用的吧晓勇。
  • 7堂飞、圖片的透明,盡量不要用绑咱,渲染過程相對(duì)比會(huì)多好幾倍
  • 8绰筛、用AutoLayout 某種程度是會(huì)重新計(jì)算的,自然是耗時(shí)的描融。

話說铝噩,其中有些點(diǎn)上現(xiàn)在是無不可避免的,例如自動(dòng)布局這塊窿克,現(xiàn)在的項(xiàng)目基本都是用的骏庸,而且隨著硬件的性能越來越好,小性能的缺失是可以忽略的年叮,整體來說掌握一個(gè)度吧具被。

二、額外想到之前看到的點(diǎn)

以下是 UIKit性能調(diào)優(yōu)實(shí)戰(zhàn)講解-- bestswifter 文章中提到的,在此直接摘抄下跃惫。

  • 避免圖層混合
    • 確倍L荆控件的opaque屬性設(shè)置為true,確保backgroundColor和父視圖顏色一致且不透明(就是不要設(shè)置View 的顏色 為Clear
    • 如無特殊需要辈挂,不要設(shè)置低于1的alpha值 (alpha = 1.0
    • 確保UIImage沒有alpha通道
  • 避免臨時(shí)轉(zhuǎn)換
    • 確保圖片大小和frame一致衬横,不要在滑動(dòng)時(shí)縮放圖片( 和重新計(jì)算尺寸有關(guān))
    • 確保圖片顏色格式被GPU支持,避免勞煩CPU轉(zhuǎn)換 (CPU 要做的事太多了
  • 慎用離屏渲染
    絕大多數(shù)時(shí)候離屏渲染會(huì)影響性能 (shouldRasterize(光柵化终蒂、masks(遮罩)蜂林、shadows(陰影)遥诉、edge antialiasing(抗鋸齒)group opacity(不透明)噪叙、復(fù)雜形狀設(shè)置圓角等矮锈、漸變...)
    • 重寫drawRect方法,設(shè)置圓角睁蕾、陰影苞笨、模糊效果,光柵化都會(huì)導(dǎo)致離屏渲染
    • 設(shè)置陰影效果是加上陰影路徑
    • 滑動(dòng)時(shí)若需要圓角效果子眶,開啟光柵化

特別是那個(gè) View 設(shè)置成 [UIColor clearColor] 是我常犯的錯(cuò)瀑凝。

三、單獨(dú)想想高度相關(guān)的優(yōu)化

對(duì)上述其中的一些點(diǎn)還沒有切身的感受體驗(yàn)臭杰,另外有些是沒法避免的粤咪,但最近老用都愛文字計(jì)算高度這塊,就想著如何讓涉及到文字計(jì)算高度這塊的影響降低呢渴杆?

  • 異步處理寥枝?
  • 提前處理?
  • 緩存 磁奖?

例如像 Cell 和 UILabel 中的計(jì)算:

  • UITableView 中 Cell 的高度處理
    固定高度時(shí)囊拜,盡量直接用下面這個(gè),而不用那個(gè)代理中的高度返回
self.tableView.rowHeight = 44;

另外比搭,高度不固定時(shí)可以用到緩存冠跷,就是那個(gè)UITableView-FDTemplateLayoutCel

#import "UITableView+FDTemplateLayoutCell.h"
  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
     return [tableView fd_heightForCellWithIdentifier:@"reuse identifer" configuration:^(id cell) { 
      // Configure this cell with data, same as what you've done in "-tableView:cellForRowAtIndexPath:" 
      // Like:
      // cell.entity = self.feedEntities[indexPath.row]; 
      }];
}

源自:優(yōu)化UITableViewCell高度計(jì)算的那些事

  • UILabel 中文字高度的計(jì)算
  - (CGSize)sizeThatFits:(CGSize)size; 
  - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context

上面相對(duì)來說,是我們平常計(jì)算高度最常用的方法敢辩,前者是 View 本身的蔽莱,后者是 String 的弟疆,但是他們放在什么位置呢戚长,此時(shí)我的想法是提前計(jì)算好,不要等到真正滑動(dòng)時(shí)再來算怠苔,這樣相對(duì)來說同廉,對(duì)性能的影響就減少啦。例如數(shù)據(jù)返回的時(shí)候柑司,順便立馬就將其需要計(jì)算的高度迫肖,然后等到需要數(shù)據(jù)更新時(shí),高度也一并返回把高度給計(jì)算好攒驰。
其實(shí)這個(gè)地方有個(gè)問題蟆湖,當(dāng)我們用自動(dòng)布局的時(shí)候,數(shù)據(jù)更新的時(shí)候一般還是會(huì)重新計(jì)算一下約束的玻粪,還是有影響的隅津。不過這也不是計(jì)算高度所涉及到的話題咯诬垂。

四、另外注意下:性能測(cè)試方法
  • TimeProfile (最直觀的)
  • CADisplayLink (fps 值的記錄)

目前個(gè)人還是只看看 TimeProfile 的伦仍,實(shí)際的不多结窘,另外之前試用了下JPFPSStatus感覺還是很清晰,但是木有自己公司的項(xiàng)目中試過充蓝。

總的說來還是要多實(shí)際操作對(duì)比的隧枫,不斷總結(jié),注意一些常用的性能影響原因谓苟,反正iOS 保持界面流暢的技巧 絕對(duì)要多看看官脓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涝焙,隨后出現(xiàn)的幾起案子确买,更是在濱河造成了極大的恐慌,老刑警劉巖纱皆,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湾趾,死亡現(xiàn)場離奇詭異,居然都是意外死亡派草,警方通過查閱死者的電腦和手機(jī)搀缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來近迁,“玉大人艺普,你說我怎么就攤上這事〖撸” “怎么了歧譬?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搏存。 經(jīng)常有香客問我瑰步,道長,這世上最難降的妖魔是什么璧眠? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任缩焦,我火速辦了婚禮,結(jié)果婚禮上责静,老公的妹妹穿的比我還像新娘袁滥。我一直安慰自己,他們只是感情好灾螃,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布题翻。 她就那樣靜靜地躺著,像睡著了一般腰鬼。 火紅的嫁衣襯著肌膚如雪嵌赠。 梳的紋絲不亂的頭發(fā)上靴拱,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音猾普,去河邊找鬼袜炕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛初家,可吹牛的內(nèi)容都是我干的偎窘。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼溜在,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼陌知!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掖肋,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤仆葡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后志笼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沿盅,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年纫溃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腰涧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紊浩,死狀恐怖窖铡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坊谁,我是刑警寧澤费彼,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站口芍,受9級(jí)特大地震影響箍铲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阶界,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一虹钮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膘融,春花似錦、人聲如沸祭玉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脱货。三九已至岛都,卻和暖如春律姨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背臼疫。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來泰國打工择份, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烫堤。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓荣赶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸽斟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拔创,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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