尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
Linux編程
點擊右側關注,免費入門到精通!
作者丨LuckyRoc
https://juejin.im/post/5c3855486fb9a04a07309684
App瘦身
資源瘦身
使用tinypng壓縮PNG圖片。視頻可以通過 Final cut等軟件進行分辨率壓縮。音頻則降低碼率即可。
非必須資源文件可以放到自己服務器上
啟動圖使用 LaunchScreen.storyboard,啟動圖在一個項目資源中占比其實蠻大的,但是使用 LaunchScreen.storyboard 只需要設置一張ImageView即可。
IconFont的使用很方便,項目中圖標太多或者隨時需要轉換圖標顏色的話,建議使用
放棄使用 Realm
Realm,據說是目前是性能最好的移動端數據庫。但是在三方庫中可以看到,Realm 的支持占了很大的比重,大約在 8M 左右。但是如果使用 FMDB 話只需要192KB,而 CoreData 幾乎可以忽略不計。
刪除重復代碼
重復代碼的審核、無用的開源庫刪除
性能優化
imageWithContentsOfFile 、 Assets.xcassets
對於大的圖片且偶爾需要顯示的應放到工程目錄下,不要放到Assets.xcassets中;並使用imageWithContentsOfFile加載不讓系統緩存
對於經常需要展示的小圖片放到Assets.xcassets中讓系統緩存,使用imageNamed加載
盡量使用非逃逸閉包
非逃逸閉包是有利於內存優化的,所以盡量使用非逃逸閉包
NSSet、NSArray
NSSet(用hash做到)和NSArray功能性質一樣,用於存儲對象,屬於集合。但是和NSArray不一樣的是它屬於 「無序集合」,在內存中存儲方式是不連續的,而NSArray是「有序集合」它內存中存儲位置是連續的。
所以在集合中尋找一個元素的時候使用NSSet,而如果需要循環集合中的所有對象來找到所需要的目標則使用NSArray
頁面卡頓
螢幕顯示圖像的原理
CPU(中央處理器)
對象的創建和銷毀,對象屬性的調整、布局計算、文本的計算和排版、圖片格式轉碼和解碼、圖像的繪制(Core Graphics)
GPU(圖形處理器)
紋理的渲染(OpenGL)
FrameBuffer(幀緩存)
1、CPU計算控件的位置、大小
2、計算完成後CPU會將這些數據提交給GPU來進行渲染
3、GPU將收到的數據轉成螢幕能顯示的數據格式,緩存到在FrameBuffer
4、然後視頻控制器從FrameBuffer讀取的數據顯示在顯示器上
卡頓產生的原因和解決方案
由於垂直同步的機制,如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時螢幕會保留之前的內容不變。這就是界面卡頓的原因。
從上面的圖中可以看到,CPU 和 GPU 不論哪個阻礙了顯示流程,都會造成掉幀現象。所以開發時,也需要分別對 CPU 和 GPU 壓力進行評估和優化。
卡頓優化-CPU
1、盡量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用CAlayer取代UIView
2、不要頻繁地跳用UIVIew的相關屬性,比如frame、bounds、transform等屬性,盡量減少不必要的修改
3、盡量提前計算好布局,在有需要時一次性調整對應的布局,不要多次修改屬性
4、Autolayout會比直接設置frame消耗更多的CPU資源
5、圖片的size最好剛好跟UIImageView的size保持一致
6、控制一下線程的最大並發數量
7、盡量把耗時的操作放到子線程
8、文本處理(尺寸的計算,繪制)
9、圖片處理(解碼、繪制)
卡頓優化-GPU
1、盡量減少視圖數量和層次
2、GPU能處理的最大紋理尺寸是4096×4096,一旦超過這個尺寸,就會占用CPU資源進行處理,所以紋理盡量不要超過這個尺寸
3、盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張圖片顯示
4、減少透明的視圖(alpha<1),不透明的就設置opaque為yes
5、盡量避免出現離屏渲染
離屏渲染
指的是在GPU在當前螢幕緩沖區以外開辟一個緩沖區進行渲染操作
導致產生離屏渲染的原因:
shouldRasterize(光柵化)
shadows(陰影)
edge antialiasing(抗鋸齒)
group opacity(不透明)
圓角(當和maskToBounds一起使用時才會觸發)
漸變
可通過 Instruments 的 Core Animation 檢測離屏渲染。
TableView 調優
提前計算好cell的高度,緩存在相應的數據源模型中,減少CPU的計算時間
盡可能的降低Storyboard、Xib等使用度
異步繪制
減少層級
Cell中的view盡可能不要使用透明
避免離屏渲染
推薦↓↓↓
長
按
關
註
?【16個技術公眾號】都在這里!
涵蓋:工程師大咖、源碼共讀、工程師共讀、數據結構與算法、黑客技術和網路安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、數據庫研發、幽默工程師等。
萬水千山總是情,點個 「好看」 行不行