并不是所有的代碼都需要性能調(diào)優(yōu)。iOS的性能調(diào)優(yōu)主要就在于表格的性能,而在使用instruments
在做性能檢測(cè)的時(shí)候,如果檢測(cè)到的性能已經(jīng)很好達(dá)到接近60fps,那么就不需要進(jìn)行性能調(diào)優(yōu),如果畫(huà)蛇添足反而會(huì)適得其反,影響性能。
圖像IO
1、系統(tǒng)在使用圖片的時(shí)候并不能直接使用,都需要先從各種格式解碼到內(nèi)存,然后才能繪制,而且解碼是一個(gè)相當(dāng)負(fù)責(zé)的過(guò)程,相當(dāng)耗時(shí)。iOS 推薦使用PNG圖片(一些很大的背景圖片可以考慮JPG或者JPEG)
,是因?yàn)橥ǔNG圖片雖然加載到內(nèi)存會(huì)更慢(圖片通常會(huì)更大)
,但是PNG的圖片的解碼算法更為簡(jiǎn)單,耗時(shí)更少。耗時(shí)操作可以考慮異步線(xiàn)程來(lái)處理
2、如果想顯示圖片到比原始尺寸小的容器中,那么一次性在后臺(tái)線(xiàn)程重新繪制到正確的尺寸會(huì)比每次顯示的時(shí)候都做縮放會(huì)更有效
3、緩存其實(shí)很簡(jiǎn)單:就是存儲(chǔ)昂貴計(jì)算后的結(jié)果(或者從閃存或者網(wǎng)絡(luò)加載的文件)
。但是緩存本質(zhì)上就是已空間(內(nèi)存)
來(lái)?yè)Q性能,但是對(duì)于移動(dòng)終端而言,內(nèi)存(RAM)
同樣是很寶貴的資源,所以我們不能把所有的東西緩存起來(lái)。可以考慮自定義緩存方式。
4、因?yàn)?code>imageNamed:會(huì)將所有的圖片緩存到內(nèi)存,自帶緩存不會(huì)在對(duì)象銷(xiāo)毀直接清除,但是占用內(nèi)存較大;imageWithContentOfFile:
方法占用內(nèi)存較少,但沒(méi)有用自帶緩存,每次使用同一個(gè)圖片都需要重新加載解碼一遍。所以如果圖片較小,并且頻繁使用的圖片,使用imageNamed:
來(lái)加載圖片(按鈕圖片/主頁(yè)圖片/占位圖)
;如果圖片較大,并且使用次數(shù)較少,使用 imageWithContentOfFile:
來(lái)加載(相冊(cè)/新特性頁(yè)面)。
圖層性能
1、UIView設(shè)置背景backgroundColor
可以避免一些混合圖層的出現(xiàn)。不知道為什么不設(shè)置背景的UIView會(huì)默認(rèn)的被認(rèn)為透明,從而出現(xiàn)混合圖層。(但是UIView的屬性表明,默認(rèn)的UIView并不是透明的)
2、UILabel如果顯示中文,就算是設(shè)置了backgroundColor
仍然在查看混合圖層的時(shí)候,還是標(biāo)紅的。設(shè)置masksToBounds = YES
即可解決(UILabel內(nèi)容是中文時(shí), label 的實(shí)際渲染區(qū)域要大于 label 的 size, 就是因?yàn)橥鈬幸蝗ν该?才會(huì)有圖層混合)
。
3、設(shè)置圓角+masksToBounds
就會(huì)導(dǎo)致離屏渲染,所以不要設(shè)置圓角,如果一定要使用圓角,可以使用UIGraphic去切圓角
4、圖片使用不要帶有alpha通道
5、圖片的使用盡量避免縮放,一定要縮放同樣考慮使用UIGraphic去畫(huà)
6、在表格視圖中為了減少圖層數(shù)量可以直接,啟用柵格化和離屏渲染。但是一定要使用instruments工具分析一下,是否有必要,但是如果開(kāi)啟柵格化就必須設(shè)置分辨率,否則邊緣會(huì)有毛刺
//手動(dòng)啟用離屏渲染
self.layer.drawsAsynchronously = true
//手動(dòng)啟用柵格化
self.layer.shouldRasterize = true
//啟用柵格化必須設(shè)置設(shè)備的分辨率,否則可能會(huì)出現(xiàn)毛刺
self.layer.rasterizationScale = UIScreen.main.scale
7、包含文本的視圖UILabel使用的時(shí)候,盡量避免修改修改frame,修改frame會(huì)導(dǎo)致文本重繪
(隱式繪制)`
8、如果圖層不會(huì)被頻繁重繪,可以對(duì)離屏渲染的圖層使用柵格化,作為一種優(yōu)化方式,比如第6條
9、表格控件不要?jiǎng)討B(tài)創(chuàng)建控件,創(chuàng)建豐富的控件,在顯示的時(shí)候根據(jù)數(shù)據(jù)隱藏或者顯示