初入iOS江湖,涉世未深的少俠們,若是不是作特別複雜的UI和交互,那麼可能根本歷來沒想要過iOS里居然還要性能優化。畢竟iPhone的性能愈來愈強了,而作一個普通的APP的話,UIKit仍是那個UIKit,一樣一套代碼,iphone四、iphone5的年代裏,可能有些卡頓,但當前已是有着最強CPU和最強GPU的iPhone8以及8Plus了,卡頓什麼的,不存在的。git
都這麼說了,老夫幹嗎還在這裏矯情?github
矯情仍是要矯情的,畢竟除了iphone8和8Plus,有些用戶可能還用着iphone5,phone6,用戶是上帝,上帝的體驗還要是照顧的。並且程序猿的身邊每每還坐着個產品經理,常常會有意無心的迸發出奇妙的靈感,「欸,這裏加個動畫比較好」 「這邊總體搞個陰影比較好」 「這裏這個效果我以爲能夠更酷炫一些」,站在公司業務的角度上,站在APP總體風格的基礎上,對於不合理的需求和靈感吾等程序猿必要力排衆議,能不作就不作。可是若是那個靈感較大的提高了用戶體驗,增長了用戶趣味,可是確實實現起來可能對性能有些影響,這個時候吾等程序猿,不能牙齒緊閉、眉頭緊鎖,不敢應答。要氣沉丹田,暗暗運力,祭出性能優化大法,方可快速完成任務,從而在產品妹子面前扳回一局。緩存
話很少說,言歸正傳,性能優化大法在此:性能優化
熟讀了上面兩本祕籍,少俠即可千秋萬載,一統江湖。多線程
有的少俠說了,上面的祕籍很差消化,一不當心,幾萬行代碼,量太多,殺雞焉用牛刀,何況就算練完了也會有點囫圇吞棗的感受,徹底不清楚內裏的運做,怕往後走火入魔,能不能我先練點簡單的,穩紮穩打,待到往後我基本功深厚的時候,再去修煉絕世祕籍,方可天下無敵。框架
不錯不錯小小年紀,既有如此胸襟,小兄弟往後前程不可限量,老夫就把畢生所學傳授與你罷。iphone
iPhone每秒刷新60次,高端一點來講FPS(Frames Per Second)爲60,1000ms除以60大約爲16.7ms,意味着每次刷新只有16.7ms的時間給iPhone用來處理各類事務,當前事務很少時,iPhone能夠輕鬆處理,FPS此時爲60,體驗如絲般順滑。但當事務較多時,iPhone力不從心,不能在16.7ms處理完成,怎麼辦呢,當前這一幀就會被丟棄,等待下一次從新提交,而此時屏幕上的內容則保持不變,一次力不從心不影響,多幾回就會被火眼金睛的用戶發現啦,大家APP卡頓了喲。佈局
因此咱們的目的就是要快,爭取在16.7ms內讓iPhone順利作完咱們交代的全部事情,天下武功無堅不破,惟快不破,要讓iPhone運行的夠快,咱們就須要分清楚它不夠快的緣由,對症下藥。post
習武之人,外修體,內練氣,內外兼修,方能立於不敗之地。iOS優化,也當以此爲切入點,揚長補短。
CPU主外:對象建立、對象調整、對象銷燬、佈局計算、文本計算、文本渲染、圖片解碼、圖像的繪製等操做是放在CPU上執行的。
GPU主內:紋理的渲染、視圖混合、離屏渲染都是在GPU上執行的。
要想讓CPU、GPU的速度夠快,就要適當給它們減輕負擔,活幹的開心了,天然速度就上去了。瞭解了各自的分工,就能針對增強,揚長補短。
針對CPU,老夫先授予你些個入門招數:
UI相關的操做,只能在主線程執行,否則就崩潰給你看,就是這麼任性。蘋果如此設計之初,可能也沒有想到APP後來的發展會如此複雜,會比電腦還要強勁,可是悔不當初,當前APP已經太多了,想要修改也沒那麼容易了,否則還各類開源框架什麼事。既然只能在主線程,那在性能要求敏感的頁面,就不要使用Xib和StoreBoard了,手動建立每每是一個更好的選擇。關於Xib和StoreBoard對性能的影響,感興趣的同窗能夠自行搜索祕籍。
非UI相關的操做,選擇就多了,如今CPU,都已是多核的了,合理利用多線程,作到左手畫方,右手畫圓,每每事半功倍。例如把文件讀取,數據計算放在子線程會給CPU更多的時間去處理UI相關的任務。
對於高度可變的Cell,在網絡數據請求完成的時候,在後臺線程計算Cell的高度,並緩存在內存當中,這樣tableView滾動的時候,就無需屢次計算。不止Cell的高度,例如Cell裏有一個行數不固定label,把label的高度也提早計算好並緩存,少俠會有意想不到的效果。固然這一操做也是要放在後臺線程執行的。
當對一個UIImageView設置一個較大的image時,須要在主線程完成重採樣的過程,耗時耗內存,因此儘可能在設置圖片時設置的和UIImageView的大小相近。
針對GPU老夫也先教你些個入門招數:
當只有一個視圖顯示屏幕上的時候,那麼視圖是什麼顏色就顯示什麼顏色,這個時候不存在圖層混合。
當有多個視圖疊加的時候,若是最上層的視圖是不透明的,有背景色的,那麼也不存在視圖混合。
當多個視圖疊加,放在上面的視圖是半透明的,那麼這個時候GPU就要進行混合,把透明的顏色加上放在下面的視圖的顏色混合以後得出一個顏色再顯示在屏幕上,這一步是消耗GPU資源的,當混合的視圖比較多的時候,GPU消耗的資源也越多。
因此爲了減輕GPU負擔,咱們要減小圖層混合操做。
這裏老夫有幾個小技巧,少俠可參考:
開啓shouldRasterize後,layer會被光柵化bitmap,layer的各類邊框、陰影等效果會被緩存在bitmap中,待下一次使用時,就能夠直接拿bitmap來用,就不須要再次費時費力的作效果了。
有的少俠一據說這個,這可好,那都開啓shouldRasterize不就完事了嗎,效果和性能兼顧了。
且慢,老夫有言相勸:
如今少俠已經了學習了性能優化的入門祕籍,作到了內外雙修,行走iOS江湖有了必定的技能傍身,往後趕上產品小師妹必能挺起胸膛,爲伊人遮風擋雨。
欲知後事如何,且看下回分解: iOS性能優化(中級)