首先要感謝作者ibireme,同時(shí)聲明這篇文章為本人拜讀大神作品的總結(jié)筆記,以列表清單的方式將iOS性能優(yōu)化點(diǎn)列了出來(lái),方便對(duì)照來(lái)進(jìn)行性能優(yōu)化,如需轉(zhuǎn)載請(qǐng)注明原文作者ibireme以及原文地址。
原文:《iOS 保持界面流暢的技巧》(如果打不開(kāi)說(shuō)明你被墻了。竊喜~)
主要是減少cpu與gpu的消耗資源壓力
一、cpu的資源消耗解決方案
1. 創(chuàng)建對(duì)象時(shí),盡量用輕量的對(duì)象代替重量的對(duì)象。比如CALayer 比 UIView要輕量許多,不需要響應(yīng)觸摸事件的控件可以用CALayer來(lái)顯示(CALayer控件只能在主線程創(chuàng)建和操作,避免通過(guò)Storyboard創(chuàng)建視圖對(duì)象)。
2. 盡量推遲對(duì)象的創(chuàng)建時(shí)間,并把對(duì)象的創(chuàng)建分散到多個(gè)任務(wù)中去。(如果對(duì)象可以復(fù)用,并且復(fù)用的代價(jià)比釋放、創(chuàng)建新對(duì)象要小,那么這類(lèi)對(duì)象應(yīng)當(dāng)盡量復(fù)用)
3. 應(yīng)盡量減少對(duì)UIView的與CALayer相關(guān)的屬性修改。(比如frame、bounds、transform、center等)
4. 盡量避免視圖層次調(diào)整,以及視圖添加和移除。
5. 避免容器內(nèi)持有大量對(duì)象同時(shí)銷(xiāo)毀,如果對(duì)象可以放到后臺(tái)去釋放,難就挪到后臺(tái)線程去。
6. 盡量減少視圖的布局計(jì)算,應(yīng)當(dāng)在后臺(tái)提前計(jì)算好視圖布局,并且對(duì)視圖布局進(jìn)行緩存。(參考第3點(diǎn),不要多次、頻繁的計(jì)算和調(diào)整視圖的這些屬性)
7. Autolayout雖能提高開(kāi)發(fā)效率,但隨著視圖數(shù)量增長(zhǎng),Autolayout會(huì)嚴(yán)重影響CPU的性能。如果你不想手動(dòng)調(diào)整frame,可以使用ComponentKit、AsyncDisplayKit等框架。
8. 如果一個(gè)界面包含大量文本,文本的寬高計(jì)算會(huì)占用很大一部分資源,并且不可避免。
9. 當(dāng)你需要顯示大量文本時(shí),最好自定義文本控件,用TextKit或者CoreText對(duì)文本異步繪制。
10. 當(dāng)你用UIImage 或 CGImageSource 的相關(guān)方法創(chuàng)建圖片時(shí),應(yīng)當(dāng)在后臺(tái)線程先把圖片繪制到 CGBitmapContext 中,從 Bitmap 直接創(chuàng)建圖片。(目前常見(jiàn)的網(wǎng)絡(luò)圖片庫(kù)都做了這個(gè)處理)
11. 圖像繪制盡量放到后臺(tái)線程,因?yàn)镃oreGraphic方法通常是線程安全的,圖像顯示時(shí)再回到主線程。
二、GPU的資源消耗解決方案
1. 避免短時(shí)間內(nèi)大量圖片的顯示,如果可以,盡可能將多張圖片合成為一張進(jìn)行顯示。
2. 盡量不要圖片和視圖的大小超過(guò)機(jī)器的紋理尺寸。http://iosres.com/
3. 你應(yīng)該盡量減少視圖數(shù)量和層次,并在不透明的視圖里標(biāo)明opaque=YES以避免無(wú)用的Alpha通道合成。(你也可以像第二點(diǎn)那樣,把多個(gè)視圖預(yù)先合成為一張圖片來(lái)顯示)
4. 應(yīng)避免使用圓角、陰影、遮罩等屬性,如必須,可將CALayer.shouldRasterize設(shè)置為YES。最好UI可以提供圓角、陰影等圖片,或者將需要顯示的圖像在后臺(tái)線程繪制為圖片。