App瘦身、性能優化總結

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

App瘦身、性能優化總結 運動 第1張

Linux編程

點擊右側關注,免費入門到精通!

作者丨LuckyRoc

https://juejin.im/post/5c3855486fb9a04a07309684

App瘦身、性能優化總結 運動 第3張App瘦身

App瘦身、性能優化總結 運動 第3張資源瘦身

使用tinypng壓縮PNG圖片。視頻可以通過 Final cut等軟件進行分辨率壓縮。音頻則降低碼率即可。

非必須資源文件可以放到自己服務器上

啟動圖使用 LaunchScreen.storyboard,啟動圖在一個項目資源中占比其實蠻大的,但是使用 LaunchScreen.storyboard 只需要設置一張ImageView即可。

IconFont的使用很方便,項目中圖標太多或者隨時需要轉換圖標顏色的話,建議使用

App瘦身、性能優化總結 運動 第3張放棄使用 Realm

Realm,據說是目前是性能最好的移動端數據庫。但是在三方庫中可以看到,Realm 的支持占了很大的比重,大約在 8M 左右。但是如果使用 FMDB 話只需要192KB,而 CoreData 幾乎可以忽略不計。

App瘦身、性能優化總結 運動 第3張刪除重復代碼

重復代碼的審核、無用的開源庫刪除

App瘦身、性能優化總結 運動 第3張性能優化

imageWithContentsOfFile 、 Assets.xcassets

對於大的圖片且偶爾需要顯示的應放到工程目錄下,不要放到Assets.xcassets中;並使用imageWithContentsOfFile加載不讓系統緩存

對於經常需要展示的小圖片放到Assets.xcassets中讓系統緩存,使用imageNamed加載

App瘦身、性能優化總結 運動 第3張盡量使用非逃逸閉包

非逃逸閉包是有利於內存優化的,所以盡量使用非逃逸閉包

App瘦身、性能優化總結 運動 第3張NSSet、NSArray

NSSet(用hash做到)和NSArray功能性質一樣,用於存儲對象,屬於集合。但是和NSArray不一樣的是它屬於 「無序集合」,在內存中存儲方式是不連續的,而NSArray是「有序集合」它內存中存儲位置是連續的。

所以在集合中尋找一個元素的時候使用NSSet,而如果需要循環集合中的所有對象來找到所需要的目標則使用NSArray

App瘦身、性能優化總結 運動 第3張頁面卡頓

螢幕顯示圖像的原理

CPU(中央處理器)

對象的創建和銷毀,對象屬性的調整、布局計算、文本的計算和排版、圖片格式轉碼和解碼、圖像的繪制(Core Graphics)

GPU(圖形處理器)

紋理的渲染(OpenGL)

FrameBuffer(幀緩存)

1、CPU計算控件的位置、大小

2、計算完成後CPU會將這些數據提交給GPU來進行渲染

3、GPU將收到的數據轉成螢幕能顯示的數據格式,緩存到在FrameBuffer

4、然後視頻控制器從FrameBuffer讀取的數據顯示在顯示器上

卡頓產生的原因和解決方案

由於垂直同步的機制,如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時螢幕會保留之前的內容不變。這就是界面卡頓的原因。

從上面的圖中可以看到,CPU 和 GPU 不論哪個阻礙了顯示流程,都會造成掉幀現象。所以開發時,也需要分別對 CPU 和 GPU 壓力進行評估和優化。

App瘦身、性能優化總結 運動 第3張卡頓優化-CPU

1、盡量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用CAlayer取代UIView

2、不要頻繁地跳用UIVIew的相關屬性,比如frame、bounds、transform等屬性,盡量減少不必要的修改

3、盡量提前計算好布局,在有需要時一次性調整對應的布局,不要多次修改屬性

4、Autolayout會比直接設置frame消耗更多的CPU資源

5、圖片的size最好剛好跟UIImageView的size保持一致

6、控制一下線程的最大並發數量

7、盡量把耗時的操作放到子線程

8、文本處理(尺寸的計算,繪制)

9、圖片處理(解碼、繪制)

App瘦身、性能優化總結 運動 第3張卡頓優化-GPU

1、盡量減少視圖數量和層次

2、GPU能處理的最大紋理尺寸是4096×4096,一旦超過這個尺寸,就會占用CPU資源進行處理,所以紋理盡量不要超過這個尺寸

3、盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張圖片顯示

4、減少透明的視圖(alpha<1),不透明的就設置opaque為yes

5、盡量避免出現離屏渲染

App瘦身、性能優化總結 運動 第3張離屏渲染

指的是在GPU在當前螢幕緩沖區以外開辟一個緩沖區進行渲染操作

導致產生離屏渲染的原因:

shouldRasterize(光柵化)

shadows(陰影)

edge antialiasing(抗鋸齒)

group opacity(不透明)

圓角(當和maskToBounds一起使用時才會觸發)

漸變

可通過 Instruments 的 Core Animation 檢測離屏渲染。

App瘦身、性能優化總結 運動 第3張TableView 調優

提前計算好cell的高度,緩存在相應的數據源模型中,減少CPU的計算時間

盡可能的降低Storyboard、Xib等使用度

異步繪制

減少層級

Cell中的view盡可能不要使用透明

避免離屏渲染

推薦↓↓↓

App瘦身、性能優化總結 運動 第17張

?16個技術公眾號】都在這里!

涵蓋:工程師大咖、源碼共讀、工程師共讀、數據結構與算法、黑客技術和網路安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、數據庫研發、幽默工程師等。

App瘦身、性能優化總結 運動 第18張

萬水千山總是情,點個 「好看」 行不行

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!