iOS系統(tǒng)區(qū)別于Android系統(tǒng),系統(tǒng)設(shè)計(jì)本身就是以用戶體驗(yàn)優(yōu)先,而非程序并發(fā)常駐。隨著硬件的不斷升級,CPU和GPU的越發(fā)強(qiáng)大,手機(jī)本身的使用體驗(yàn)也在不斷提高。
但是即便如此,iOS程序設(shè)計(jì)和開發(fā)時(shí)還是有很多需要注意的地方,來進(jìn)一步提升用戶體驗(yàn)。
大概有幾個(gè)方面:
- app 啟動(dòng)速度提升
- 瀏覽的流暢性提升
- 圖片、視屏、直播秒開
- 減少發(fā)熱和和耗電
1.APP啟動(dòng)速度提升
iOS應(yīng)用的啟動(dòng)可分為pre-main階段和main兩個(gè)階段,所以App總啟動(dòng)時(shí)間 = pre-main耗時(shí) + main耗時(shí)

借用兩張經(jīng)典的圖:


所以,優(yōu)化啟動(dòng)時(shí)長分兩個(gè)階段
pre-main階段優(yōu)化
1、刪除無用代碼(未被調(diào)用的靜態(tài)變量、類和方法)
可以使用AppCode對工程進(jìn)行掃描,刪除 未使用的本地變量 參數(shù) 值
2、抽象重復(fù)代碼
3、+load方法中做的事情延遲到+initialize中,或者在+load中做的事情不宜花費(fèi)過多時(shí)間
因?yàn)閘oad是在啟動(dòng)的時(shí)候調(diào)用,而initialize是在類首次被使用的時(shí)候調(diào)用,不過當(dāng)你把load中的邏輯移到initialize中時(shí)候,一定要注意initialize的重復(fù)調(diào)用問題。
4、減少不必要的framework,或者優(yōu)化已有的framework
main階段優(yōu)化
main函數(shù)開始到第一個(gè)界面渲染完成這段時(shí)間,優(yōu)化出發(fā)點(diǎn)就是減少從main函數(shù)開始到第一個(gè)界面出現(xiàn)的時(shí)間,可以從兩方面入手:
1、didFinishLaunchingWithOptions中有些服務(wù)可以采用懶加載的方式
2、首次啟動(dòng)渲染的頁面優(yōu)化
不使用xib或者storyboard,直接使用代碼;
對于viewDidLoad以及viewWillAppear方法中盡量去嘗試少做,晚做,不做,或者采用異步的方式去做
2.瀏覽的流暢性提升
這里可以細(xì)分為兩個(gè)方面:本頁面的滑動(dòng)順暢性 和 新頁面跳轉(zhuǎn)
本頁面的滑動(dòng)流程性
- 對象的創(chuàng)建
1.盡量用輕量對象,比如CALayer 比 UIView 要輕量許多,不考慮交互,可以選擇CALayer。
2.Storyboard和xib加載對象時(shí),消耗的成本比代碼多。慎用
3.預(yù)加載和懶加載,cache的使用, 充分使用cel復(fù)用機(jī)制
- 布局計(jì)算
1.視圖計(jì)算比較消耗CPU性能,修改uiview的frame相關(guān)屬性,更是消耗cpu性能,盡量避免頻繁的布局更新
2.自動(dòng)布局對cpu的消耗隨著復(fù)雜度是呈指數(shù)級的,慎用autoLayout
紋理渲染
1.當(dāng)在較短時(shí)間顯示大量圖片時(shí)(比如 TableView 存在非常多的圖片并且快速滑動(dòng)時(shí)),CPU 占用率很低,GPU 占用非常高。避免這種情況的方法只能是盡量減少在短時(shí)間內(nèi)大量圖片的顯示,盡可能將多張圖片合成為一張進(jìn)行顯示。
2.當(dāng)圖片過大,超過 GPU 的最大紋理尺寸時(shí),圖片需要先由 CPU 進(jìn)行預(yù)處理,這對 CPU 和 GPU 都會(huì)帶來額外的資源消耗。目前來說,iPhone 4S 以上機(jī)型,紋理尺寸上限都是 4096×4096。所以,盡量不要讓圖片和視圖的大小超過這個(gè)值。視圖混合
當(dāng)多個(gè)視圖或者CALayer混合顯示時(shí),GPU會(huì)將它們混合到一起,視圖多,結(jié)構(gòu)復(fù)雜就會(huì)增加混合難度。解決方法:減少視圖個(gè)數(shù)和層次,在不透明的視圖中標(biāo)明opaque 屬性以避免無用的 Alpha 通道合成?;蛘甙阉鼈兒铣傻揭粡埓髨D上。圖形生成
CALayer 的 border、圓角、陰影、遮罩(mask),CASharpLayer 的矢量圖形顯示,以及透明半透明的使用, 會(huì)觸發(fā)離屏渲染(offscreen rendering),
為了避免這種情況,另外解決方法是把需要顯示的圖形在后臺(tái)線程繪制為圖片,避免使用圓角、陰影、遮罩等屬性。內(nèi)存控制,及時(shí)釋放
異步加載,避免卡主線程,避免使用dataWithContentsOfURL等方法
數(shù)據(jù)結(jié)構(gòu)處理,json速度上優(yōu)于xml
新頁面跳轉(zhuǎn)
把關(guān)鍵的且耗時(shí)少的運(yùn)算放在viewdidload里,減少ViewController 在切換時(shí)候的卡頓時(shí)間
部分UI渲染放在 viewWillAppear 里運(yùn)算
部分復(fù)雜的運(yùn)算可以丟在 viewDidAppear 里
觸發(fā)型的做觸發(fā)加載,或者延遲加載
避免使用頁面跳轉(zhuǎn)過場動(dòng)畫
load數(shù)據(jù)的異步加載
3.圖片、視屏、直播秒開
根據(jù)策略進(jìn)行預(yù)加載,圖片緩存,注意壓縮
獲取視頻關(guān)鍵幀,根據(jù)網(wǎng)絡(luò)情況,動(dòng)態(tài)調(diào)整碼率
提高拉流優(yōu)先級,進(jìn)入頁面先拉流
4.減少發(fā)熱和耗電
定位管理器和 GPS,地理位置獲取,不用的時(shí)候關(guān)掉
減少無用的網(wǎng)絡(luò)接口請求,特別是輪詢接口
減少計(jì)算,優(yōu)化算法,數(shù)據(jù)結(jié)構(gòu)
其他
其他的用戶感知和交互方面,應(yīng)該盡量人性化。
頁面鏈路清晰,進(jìn)退有路。
一目了然,及時(shí)提示。
避免空白頁,卡主線程,等待無感知或者動(dòng)畫過渡。
等等。