? 導(dǎo)讀
一款手機(jī)應(yīng)用 從開發(fā)過程中就要做好 性能優(yōu)化,這樣才能 讓用戶體驗(yàn)度 提升, 假如 我們打開一個(gè)應(yīng)用 出現(xiàn)卡頓, 不流暢,則會(huì)很影響 用戶對該應(yīng)用的態(tài)度,產(chǎn)品狗 都很注意這些人機(jī)交互方面的 體驗(yàn)。性能是一款A(yù)pp的靈魂.
開發(fā)人員在處理 性能問題時(shí),需要做的第一件事情就是判斷是否是應(yīng)用自身引起的性能問題,然后再對癥下藥
不過我得要提一下,“過早的優(yōu)化是萬惡之源”,在需求未定,性能問題不明顯時(shí),沒必要嘗試做優(yōu)化,而要盡量正確的實(shí)現(xiàn)功能。做性能優(yōu)化時(shí),也最好是走修改代碼 -> Profile -> 修改代碼這樣一個(gè)流程,優(yōu)先解決最值得優(yōu)化的地方。
對于 CPU 的卡頓,它可以通過內(nèi)置的 CADisplayLink 檢測出來;對于 GPU 帶來的卡頓,它用了一個(gè) 1x1 的 SKView 來進(jìn)行監(jiān)視。
應(yīng)用層的性能優(yōu)化通??梢詮囊韵聨讉€(gè)方面考慮:
1.了解編程語言的編譯原理,使用高效編碼方式從語法上提高程序性能;
2.采用合理的數(shù)據(jù)結(jié)構(gòu)和算法提高程序性能,這往往是決定程序性能的關(guān)鍵;
3.重視界面布局優(yōu)化;
4.采用多線程、緩存數(shù)據(jù)、延遲加載、提前加載等手段,解決嚴(yán)重的性能瓶頸;
5.合理配置虛擬機(jī)堆內(nèi)存使用上限和使用率,減少垃圾回收頻率;
6.合理使用native代碼;
7.合理配置數(shù)據(jù)庫緩存類型和優(yōu)化SQL語句加快讀取速度,使用事務(wù)加快寫入速度;
8.使用工具分析性能問題,找出性能瓶頸;
iOS中性能優(yōu)化集錦
避免創(chuàng)建不必要的對象,合理的使用單例模式,
創(chuàng)建太多的對象會(huì)造成性能低下,這誰都知道,可是為什么呢?首先分配內(nèi)存 ? ?本身需要時(shí)間,其次虛擬機(jī)運(yùn)行時(shí)堆內(nèi)存使用量是有上限的,當(dāng)內(nèi)存到達(dá)一定程度時(shí)會(huì)產(chǎn)生內(nèi)存警告,系統(tǒng)會(huì)自動(dòng)釋放一些閑置的對象.可想而知,如果有對象頻繁的創(chuàng)建和銷毀,或者內(nèi)存使用率很高,就會(huì)造成應(yīng)用程序嚴(yán)重卡頓。
單例模式,提供了對唯一實(shí)例的受控訪問。由于在系統(tǒng)內(nèi)存中只存在一個(gè)對象,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
離屏渲染問題:
當(dāng)一個(gè)視圖中有大量圓角,應(yīng)該考慮使用Core Graphics的技術(shù)進(jìn)行繪制操作(即Quarz2D繪圖)來實(shí)現(xiàn)圓角.替代cornerRadius,mask方案.深入一步優(yōu)化的話,可以考慮異步繪制.在異步線程中繪制圓角.
為了避免離屏渲染,你應(yīng)當(dāng)盡量避免使用 layer 的 border、corner、shadow、mask 等技術(shù),而盡量在后臺(tái)線程預(yù)先繪制好對應(yīng)內(nèi)容。
緩存排版(緩存視圖寬高)
Layout計(jì)算視圖布局寬高 是一個(gè)相對耗時(shí)的操作,當(dāng)一個(gè)界面有大量的需要計(jì)算寬高的視圖時(shí)(如TabbleView),應(yīng)將視圖的寬高進(jìn)行緩存處理.避免重復(fù)的計(jì)算.若要再進(jìn)一步優(yōu)化的話,可以將計(jì)算操作放入工作線程中.等計(jì)算完成后再回到主線程刷新UI.
面試官喜歡問的關(guān)于SDWebImage的性能優(yōu)化處理
SDWebImage 框架封裝了很多網(wǎng)絡(luò)異步下載圖片的方法,性能也算很不錯(cuò). 其實(shí)我們還可以做進(jìn)一步優(yōu)化,在顯示簡單的單張圖片時(shí),可以利用 ?UIView.layer.contents 就足夠了,沒必要使用 UIImageView 帶來額外的資源消耗,為此我們在 CALayer 上添加了 setImageWithURL 等方法
TabbleView列表中有多個(gè)視覺元素并不需要觸摸事件,這些元素可以用 圖層合成技術(shù)預(yù)先繪制為一張圖。 再進(jìn)一步減少每個(gè) Cell 內(nèi)圖層的數(shù)量,用 CALayer 替換掉 UIView。 當(dāng)每個(gè) Cell 的類型都是相同的,但顯示的內(nèi)容卻各部一樣,比如有的 Cell 有圖片,有的 Cell 里是卡片。把 Cell 按類型劃分,進(jìn)一步減少 Cell 內(nèi)不必要的視圖對象和操作,應(yīng)該能有一些效果。
關(guān)于透明度對性能的影響
只要一個(gè)視圖的不透明度小于1,就會(huì)導(dǎo)致blending.blending在iOS的圖形處理中,blending主要指的是混合像素顏色的計(jì)算。舉個(gè)例子,我們把兩個(gè)圖層疊加在一起,如果第一個(gè)圖層的有透明效果,則最終像素的顏色計(jì)算需要將第二個(gè)圖層也考慮進(jìn)來。這一過程即為Blending。
為什么Blending會(huì)導(dǎo)致性能的損失?
原因是很直觀的,如果一個(gè)圖層是不透明的,則系統(tǒng)直接顯示該圖層的顏色即可。而如果圖層是透明的,則會(huì)引入更多的計(jì)算,因?yàn)樾枰严旅娴膱D層也包括進(jìn)來,進(jìn)行混合后顏色的計(jì)算。
視圖的延遲加載
如果界面中有一部分視圖控件不需要立即顯示,則我們可以將它設(shè)計(jì)成延遲加載模式,當(dāng)真正要使用它的時(shí)候再進(jìn)行創(chuàng)建.
及時(shí)釋放不需要再使用的對象
把程序中不需要再使用的對象和內(nèi)存空間及時(shí)釋放,可以節(jié)省程序的內(nèi)存消耗,從而提高性能.
暫且就想到了這么多,剩下的以后再慢慢補(bǔ)上.大家如果有要我補(bǔ)充的可以在下面評論,我有空就補(bǔ)上.