iOS滑動(dòng)優(yōu)化
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
iOS優(yōu)化(三)沒錯(cuò)我還是滑動(dòng)優(yōu)化2017-07-05 11:58iOS 近期把滑動(dòng)優(yōu)化的一些經(jīng)驗(yàn)整理了一下,在公司做了一次技術(shù)分享,和我之前的文章有一小部分重疊。現(xiàn)摘要如下,希望大家不吝賜教,共同討論進(jìn)步。
一。滑動(dòng)優(yōu)化的玄學(xué)
為什么說是玄學(xué)呢,因?yàn)榇蟛糠智闆r下的APP,用不到這些優(yōu)化的點(diǎn),過早的優(yōu)化是惡魔,當(dāng)真正出現(xiàn)性能問題的時(shí)候,再考慮這些方面的優(yōu)化。
1.多個(gè)透明元素重疊顯示的性能問題。
解決方案:合并成一張圖顯示
原理:CPU方面,減少了UIKit的創(chuàng)建消耗,GPU方面,避免了合成渲染產(chǎn)生的消耗。
AsyncDisplayKit(現(xiàn)在叫Texture),針對(duì)多個(gè)透明元素的重疊,預(yù)合并無點(diǎn)擊響應(yīng),不改變動(dòng)畫的圖層。
Texture的保持流暢的原理:UIKit不是線程安全的,所以必須在主線程改動(dòng)。Texture利用中間變量存儲(chǔ)改動(dòng),保證線程安全,在合適的機(jī)會(huì)將并發(fā)操作同步到主線程。
暫時(shí)不用Texture的原因:需要用Texture Node Container替換UIKit元素,成本較大。
2.靜態(tài)cell、多圖待加載的優(yōu)化
解決方案:合并成一張圖顯示;
原理:提升I/O速度,一個(gè)大文件的讀取速度,通常比多個(gè)小文件要快。
3.展示適合界面尺寸圖片,不進(jìn)行拉伸縮放。
解決方案:從服務(wù)器拉取合適尺寸的圖片(例如七牛的服務(wù)就帶裁剪/壓縮參數(shù));
原理:過大圖片對(duì)內(nèi)存消耗巨大(圖片占用內(nèi)存 = 圖像高×圖像寬×像素位數(shù));不符合UIImageView尺寸的圖片,進(jìn)行重新縮減/放大尺寸的消耗是非常巨大的。
4.imageNamed和imageWithContentsOfFile
這個(gè)知道的人比較多,因?yàn)榫彺鎴D片的消耗通常是肉眼可見的多。
常用的元素例如icon之類的,采用imageNamed:,系統(tǒng)會(huì)有緩存。
如果是較大或者不常用的圖片資源,采用imageWithContentsOfFile:。
5.減少autolayout的使用
解決方案:頁面元素多的時(shí)候,減少autolayout布局,采用frame。
原理:元素多時(shí),autolayout的消耗非常驚人(http://pilky.me/36/) ,之前看過搜狗的iOS分享,搜狗輸入法鍵盤彈出狂卡即是此原因;
6.獲取文件大小
解決方案:不要使用NSFileManager,用C的stat來獲取文件信息。
實(shí)例:獲取一個(gè)目錄下所有文件大小,進(jìn)行多次遞歸計(jì)算,stat幾乎瞬間完成,NSFileManager耗時(shí)較長。
解決方案:。緩存NSDateFormatter結(jié)果,不多次創(chuàng)建,及時(shí)釋放。
做過類似日歷的同學(xué)應(yīng)該都懂??
8.圖片解碼:
解決方案:CALayer 被提交到 GPU 前,CGImage 中的數(shù)據(jù)才會(huì)得到解碼,GPU執(zhí)行,卡主線程。常見的做法是在后臺(tái)線程先把圖片繪制到 CGBitmapContext 中,然后從 Bitmap 直接創(chuàng)建圖片。
SDWebImage/YYImage等圖片庫都是這么做的,有興趣的同學(xué)可以去看下源碼。如果你是自己做圖片下載,就要考慮到相關(guān)優(yōu)化。
二.cell高度預(yù)計(jì)算/緩存
解決方案:。緩存NSDateFormatter結(jié)果,不多次創(chuàng)建,及時(shí)釋放。
做過類似日歷的同學(xué)應(yīng)該都懂??
一般情況下,不要用estimatedRowHeight,不然容易鬼畜;
systemLayoutSizeFittingSize:這個(gè)方法,就是大部分cell布局庫采用的方法,只要從上至下布局全部生效,就能計(jì)算高度,不要多次調(diào)用;
由于UITableView繪制過程中多次調(diào)用繪制,所以緩存高度計(jì)算結(jié)果,可以有效的增加滑動(dòng)流暢度;
當(dāng)cell高度改變,記得及時(shí)替換緩存;
三。離屏渲染
觸發(fā)條件:CALayer 的 border、圓角、陰影、遮罩(mask),CASharpLayer 的矢量圖形顯示。
主要問題:GPU占滿,CPU空閑
解決方法:
1.開啟CALayer.shouldRasterize ,轉(zhuǎn)嫁到CPU上;
2.粗暴畫圖/截圖實(shí)現(xiàn)border和圓角;
3.砍死設(shè)計(jì)師。
最近拖延癥有點(diǎn)厲害,這篇文章想寫了很久都沒寫出來,我先摘要一部分思路出來。
曾經(jīng)的需求是這樣的:
?
注意需求的圈和頭像之間是有空隙的
初期方案是圖片下載完成后,裁成圓形,然后外面用貝塞爾畫一個(gè)圈,根據(jù)不同的UI緩存不同多個(gè)帶圈兒的圖;
然而。。.神奇的產(chǎn)品第二版給我整出了無數(shù)個(gè)各種不同大小、間距、透明度的圈。這樣就意味著我得緩存無數(shù)帶著各色圈兒的圖。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
iOS滑動(dòng)優(yōu)化下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問題? 377
- 華為全新鴻蒙蓄勢(shì)待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋果手機(jī)系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬部;消息稱 MiOS 僅限國內(nèi),小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過熱 216
- Testin云測(cè)兼容和真機(jī)服務(wù)平臺(tái)中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國產(chǎn)飛騰騰銳D2000芯片的開源BIOS固件版本 448