您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>通訊/手機(jī)編程>

iOS滑動(dòng)優(yōu)化

大小:0.3 MB 人氣: 2017-09-25 需要積分:1

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í)較長。

7.NSDateFormatter產(chǎn)生較大消耗

解決方案:。緩存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)厲害,這篇文章想寫了很久都沒寫出來,我先摘要一部分思路出來。

iOS滑動(dòng)優(yōu)化

曾經(jīng)的需求是這樣的:

?

注意需求的圈和頭像之間是有空隙的

初期方案是圖片下載完成后,裁成圓形,然后外面用貝塞爾畫一個(gè)圈,根據(jù)不同的UI緩存不同多個(gè)帶圈兒的圖;

然而。。.神奇的產(chǎn)品第二版給我整出了無數(shù)個(gè)各種不同大小、間距、透明度的圈。這樣就意味著我得緩存無數(shù)帶著各色圈兒的圖。
iOS滑動(dòng)優(yōu)化

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?