一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

iOS滑動優(yōu)化

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

iOS優(yōu)化(三)沒錯我還是滑動優(yōu)化2017-07-05 11:58iOS  近期把滑動優(yōu)化的一些經(jīng)驗(yàn)整理了一下,在公司做了一次技術(shù)分享,和我之前的文章有一小部分重疊?,F(xiàn)摘要如下,希望大家不吝賜教,共同討論進(jìn)步。

一?;瑒觾?yōu)化的玄學(xué)

為什么說是玄學(xué)呢,因?yàn)榇蟛糠智闆r下的APP,用不到這些優(yōu)化的點(diǎn),過早的優(yōu)化是惡魔,當(dāng)真正出現(xiàn)性能問題的時候,再考慮這些方面的優(yōu)化。

1.多個透明元素重疊顯示的性能問題。

解決方案:合并成一張圖顯示

原理:CPU方面,減少了UIKit的創(chuàng)建消耗,GPU方面,避免了合成渲染產(chǎn)生的消耗。

AsyncDisplayKit(現(xiàn)在叫Texture),針對多個透明元素的重疊,預(yù)合并無點(diǎn)擊響應(yīng),不改變動畫的圖層。

Texture的保持流暢的原理:UIKit不是線程安全的,所以必須在主線程改動。Texture利用中間變量存儲改動,保證線程安全,在合適的機(jī)會將并發(fā)操作同步到主線程。

暫時不用Texture的原因:需要用Texture Node Container替換UIKit元素,成本較大。

2.靜態(tài)cell、多圖待加載的優(yōu)化

解決方案:合并成一張圖顯示;

原理:提升I/O速度,一個大文件的讀取速度,通常比多個小文件要快。

3.展示適合界面尺寸圖片,不進(jìn)行拉伸縮放。

解決方案:從服務(wù)器拉取合適尺寸的圖片(例如七牛的服務(wù)就帶裁剪/壓縮參數(shù));

原理:過大圖片對內(nèi)存消耗巨大(圖片占用內(nèi)存 = 圖像高×圖像寬×像素位數(shù));不符合UIImageView尺寸的圖片,進(jìn)行重新縮減/放大尺寸的消耗是非常巨大的。

4.imageNamed和imageWithContentsOfFile

這個知道的人比較多,因?yàn)榫彺鎴D片的消耗通常是肉眼可見的多。

常用的元素例如icon之類的,采用imageNamed:,系統(tǒng)會有緩存。

如果是較大或者不常用的圖片資源,采用imageWithContentsOfFile:。

5.減少autolayout的使用

解決方案:頁面元素多的時候,減少autolayout布局,采用frame。

原理:元素多時,autolayout的消耗非常驚人(http://pilky.me/36/) ,之前看過搜狗的iOS分享,搜狗輸入法鍵盤彈出狂卡即是此原因;

6.獲取文件大小

解決方案:不要使用NSFileManager,用C的stat來獲取文件信息

實(shí)例:獲取一個目錄下所有文件大小,進(jìn)行多次遞歸計(jì)算,stat幾乎瞬間完成,NSFileManager耗時較長。

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

解決方案:。緩存NSDateFormatter結(jié)果,不多次創(chuàng)建,及時釋放。

做過類似日歷的同學(xué)應(yīng)該都懂??

8.圖片解碼:

解決方案:CALayer 被提交到 GPU 前,CGImage 中的數(shù)據(jù)才會得到解碼,GPU執(zhí)行,卡主線程。常見的做法是在后臺線程先把圖片繪制到 CGBitmapContext 中,然后從 Bitmap 直接創(chuàng)建圖片。

SDWebImage/YYImage等圖片庫都是這么做的,有興趣的同學(xué)可以去看下源碼。如果你是自己做圖片下載,就要考慮到相關(guān)優(yōu)化。

二.cell高度預(yù)計(jì)算/緩存

解決方案:。緩存NSDateFormatter結(jié)果,不多次創(chuàng)建,及時釋放。

做過類似日歷的同學(xué)應(yīng)該都懂??

一般情況下,不要用estimatedRowHeight,不然容易鬼畜;

systemLayoutSizeFittingSize:這個方法,就是大部分cell布局庫采用的方法,只要從上至下布局全部生效,就能計(jì)算高度,不要多次調(diào)用;

由于UITableView繪制過程中多次調(diào)用繪制,所以緩存高度計(jì)算結(jié)果,可以有效的增加滑動流暢度;

當(dāng)cell高度改變,記得及時替換緩存;

三。離屏渲染

觸發(fā)條件:CALayer 的 border、圓角、陰影、遮罩(mask),CASharpLayer 的矢量圖形顯示。

主要問題:GPU占滿,CPU空閑

解決方法:

1.開啟CALayer.shouldRasterize ,轉(zhuǎn)嫁到CPU上;

2.粗暴畫圖/截圖實(shí)現(xiàn)border和圓角;

3.砍死設(shè)計(jì)師。

最近拖延癥有點(diǎn)厲害,這篇文章想寫了很久都沒寫出來,我先摘要一部分思路出來。

iOS滑動優(yōu)化

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

?

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

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

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

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

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

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

      ?