App瘦身
資源瘦身
- 使用
tinypng
壓縮PNG圖片。視頻可以通過 Final cut等軟件進(jìn)行分辨率壓縮感帅。音頻則降低碼率即可斗锭。 - 非必須資源文件可以放到自己服務(wù)器上
- 啟動(dòng)圖使用
LaunchScreen.storyboard
,啟動(dòng)圖在一個(gè)項(xiàng)目資源中占比其實(shí)蠻大的失球,但是使用LaunchScreen.storyboard
只需要設(shè)置一張ImageView即可岖是。 -
IconFont的
使用很方便,項(xiàng)目中圖標(biāo)太多或者隨時(shí)需要轉(zhuǎn)換圖標(biāo)顏色的話实苞,建議使用
放棄使用 Realm
Realm
豺撑,據(jù)說是目前是性能最好的移動(dòng)端數(shù)據(jù)庫。但是在三方庫中可以看到黔牵,Realm
的支持占了很大的比重聪轿,大約在 8M 左右。但是如果使用 FMDB
話只需要192KB猾浦,而 CoreData
幾乎可以忽略不計(jì)陆错。
刪除重復(fù)代碼
重復(fù)代碼的審核灯抛、無用的開源庫刪除
性能優(yōu)化
imageWithContentsOfFile 、 Assets.xcassets
- 對于大的圖片且偶爾需要顯示的應(yīng)放到工程目錄下音瓷,不要放到
Assets.xcassets
中对嚼;并使用imageWithContentsOfFile
加載不讓系統(tǒng)緩存 - 對于經(jīng)常需要展示的小圖片放到
Assets.xcassets
中讓系統(tǒng)緩存,使用imageNamed
加載
盡量使用非逃逸閉包
非逃逸閉包是有利于內(nèi)存優(yōu)化的绳慎,所以盡量使用非逃逸閉包
NSSet纵竖、NSArray
NSSet
(用hash實(shí)現(xiàn))和NSArray
功能性質(zhì)一樣,用于存儲(chǔ)對象偷线,屬于集合磨确。但是和NSArray
不一樣的是它屬于 “無序集合”沽甥,在內(nèi)存中存儲(chǔ)方式是不連續(xù)的声邦,而NSArray
是“有序集合”它內(nèi)存中存儲(chǔ)位置是連續(xù)的。
所以在集合中尋找一個(gè)元素的時(shí)候使用NSSet
摆舟,而如果需要循環(huán)集合中的所有對象來找到所需要的目標(biāo)則使用NSArray
頁面卡頓
屏幕顯示圖像的原理
- CPU(中央處理器)
對象的創(chuàng)建和銷毀亥曹,對象屬性的調(diào)整、布局計(jì)算恨诱、文本的計(jì)算和排版媳瞪、圖片格式轉(zhuǎn)碼和解碼、圖像的繪制(Core Graphics
)
- GPU(圖形處理器)
紋理的渲染(OpenGL
)
- FrameBuffer(幀緩存)
- 1照宝、
CPU
計(jì)算控件的位置蛇受、大小 - 2、計(jì)算完成后
CPU
會(huì)將這些數(shù)據(jù)提交給GPU
來進(jìn)行渲染 - 3厕鹃、GPU將收到的數(shù)據(jù)轉(zhuǎn)成屏幕能顯示的數(shù)據(jù)格式兢仰,緩存到在
FrameBuffer
- 4、然后
視頻控制器
從FrameBuffer
讀取的數(shù)據(jù)顯示在顯示器
上
卡頓產(chǎn)生的原因和解決方案
由于垂直同步的機(jī)制剂碴,如果在一個(gè) VSync 時(shí)間內(nèi)把将,CPU 或者 GPU 沒有完成內(nèi)容提交,則那一幀就會(huì)被丟棄忆矛,等待下一次機(jī)會(huì)再顯示察蹲,而這時(shí)顯示屏?xí)A糁暗膬?nèi)容不變。這就是界面卡頓的原因催训。
從上面的圖中可以看到洽议,CPU 和 GPU 不論哪個(gè)阻礙了顯示流程,都會(huì)造成掉幀現(xiàn)象漫拭。所以開發(fā)時(shí)亚兄,也需要分別對 CPU 和 GPU 壓力進(jìn)行評(píng)估和優(yōu)化。
卡頓優(yōu)化-CPU
- 1嫂侍、盡量用輕量級(jí)的對象儿捧,比如用不到事件處理的地方荚坞,可以考慮使用
CAlayer
取代UIView
- 2、不要頻繁地跳用
UIVIew
的相關(guān)屬性菲盾,比如frame
颓影、bounds
、transform
等屬性懒鉴,盡量減少不必要的修改 - 3诡挂、盡量提前計(jì)算好布局,在有需要時(shí)一次性調(diào)整對應(yīng)的布局临谱,不要多次修改屬性
- 4璃俗、
Autolayout
會(huì)比直接設(shè)置frame
消耗更多的CPU資源 - 5、圖片的size最好剛好跟
UIImageView
的size
保持一致 - 6悉默、控制一下線程的最大并發(fā)數(shù)量
- 7城豁、盡量把耗時(shí)的操作放到子線程
- 8、文本處理(尺寸的計(jì)算抄课,繪制)
- 9唱星、圖片處理(解碼、繪制)
卡頓優(yōu)化-GPU
- 1跟磨、盡量減少視圖數(shù)量和層次
- 2间聊、
GPU
能處理的最大紋理尺寸是4096x4096,一旦超過這個(gè)尺寸抵拘,就會(huì)占用CPU
資源進(jìn)行處理哎榴,所以紋理盡量不要超過這個(gè)尺寸 - 3、盡量避免短時(shí)間內(nèi)大量圖片的顯示僵蛛,盡可能將多張圖片合成一張圖片顯示
- 4尚蝌、減少透明的視圖(alpha<1),不透明的就設(shè)置opaque為yes
- 5墩瞳、盡量避免出現(xiàn)離屏渲染
離屏渲染
指的是在GPU在當(dāng)前屏幕緩沖區(qū)以外開辟一個(gè)緩沖區(qū)進(jìn)行渲染操作
導(dǎo)致產(chǎn)生離屏渲染的原因:
- shouldRasterize(光柵化)
- shadows(陰影)
- edge antialiasing(抗鋸齒)
- group opacity(不透明)
- 圓角(當(dāng)和maskToBounds一起使用時(shí)才會(huì)觸發(fā))
- 漸變
可通過 Instruments 的 Core Animation 檢測離屏渲染驼壶。
TableView 調(diào)優(yōu)
- 提前計(jì)算好
cell
的高度,緩存在相應(yīng)的數(shù)據(jù)源模型中,減少CPU
的計(jì)算時(shí)間 - 盡可能的降低
Storyboard
喉酌、Xib
等使用度 - 異步繪制
- 減少層級(jí)
- Cell中的view盡可能不要使用透明
- 避免離屏渲染