淺談iOS Rendering 技術(shù)框架
*?? iOS 渲染相關(guān)的層級(jí)劃分大概如下:
UIKit -> CoreAnimation -> OpenGL ES = CoreGraphics -> Graphics Hardware (GPU)
UIKit
我們?nèi)粘i_(kāi)發(fā)中使用的用戶交互組件都來(lái)自于 UIKit Framework,我們通過(guò)設(shè)置 UIKit 組件的 Layout 以及 BackgroundColor 等屬性來(lái)完成日常的界面繪畫(huà)工作
CoreAnimation
Core Animation 本質(zhì)上可以理解為是一個(gè)復(fù)合引擎,旨在盡可能快的組合屏幕上不同的顯示內(nèi)容边酒。這些顯示內(nèi)容被分解成獨(dú)立的圖層苹威,即 CALayer袁滥,CALayer 才是你所能在屏幕上看見(jiàn)的一切的基礎(chǔ)厕九,我們稱之為圖層樹(shù)
OpenGL ES
OpenGL ES 簡(jiǎn)稱 GLES颈娜,即 OpenGL for Embedded Systems自晰,是 OpenGL 的子集凝化,通常面向圖形硬件加速處理單元(GPU)渲染 2D 和 3D 計(jì)算機(jī)圖形
Core Graphics
Core Graphics Framework 基于 Quartz 高級(jí)繪圖引擎。它提供了具有無(wú)與倫比的輸出保真度的低級(jí)別輕量級(jí) 2D 渲染酬荞。您可以使用此框架來(lái)處理基于路徑的繪圖搓劫,轉(zhuǎn)換,顏色管理混巧,離屏渲染枪向,圖案,漸變和陰影咧党,圖像數(shù)據(jù)管理秘蛔,圖像創(chuàng)建和圖像遮罩以及 PDF 文檔創(chuàng)建,顯示和分析
CPU 資源消耗原因和解決方案
- 對(duì)象創(chuàng)建:對(duì)象的創(chuàng)建會(huì)分配內(nèi)存傍衡、調(diào)整屬性深员、甚至還有讀取文件等操作,比較消耗 CPU 資源蛙埂。例如:通過(guò) Storyboard 創(chuàng)建視圖對(duì)象時(shí)倦畅,其資源消耗會(huì)比直接通過(guò)代碼創(chuàng)建對(duì)象要大非常多, CALayer 比 UIView 要輕量許多绣的,那么不需要響應(yīng)觸摸事件的控件叠赐,用 CALayer 顯示會(huì)更加合適
- 對(duì)象調(diào)整:調(diào)整視圖層次、添加和移除視圖屡江,UIView 的屬性進(jìn)行調(diào)整時(shí)芭概,消耗的資源要遠(yuǎn)大于一般的屬性。對(duì)此你在應(yīng)用中惩嘉,應(yīng)該盡量減少不必要的屬性修改
- 對(duì)象銷毀:對(duì)象的銷毀雖然消耗資源不多谈山,但累積起來(lái)也是不容忽視的
- 布局計(jì)算:Autolayout 是蘋(píng)果本身提倡的技術(shù),在大部分情況下也能很好的提升開(kāi)發(fā)效率宏怔,但是 Autolayout 對(duì)于復(fù)雜視圖來(lái)說(shuō)常常會(huì)產(chǎn)生嚴(yán)重的性能問(wèn)題奏路。頻繁的畴椰,多次的修改布局會(huì)很消耗資源,使用ComponentKit鸽粉、AsyncDisplayKit等框架
- 文本計(jì)算斜脂,渲染:常見(jiàn)的文本控件 (UILabel、UITextView 等)触机,其排版和繪制都是在主線程進(jìn)行的帚戳,當(dāng)顯示大量文本時(shí),CPU 的壓力會(huì)非常大儡首,當(dāng)然很少會(huì)出現(xiàn)這種現(xiàn)象片任,如果要解決這種現(xiàn)象,用CoreText蔬胯,占用內(nèi)存較少对供,可以緩存下來(lái)以備稍后多次渲染
- 圖片的解碼,圖像的繪制:在后臺(tái)線程先把圖片繪制到 CGBitmapContext 中氛濒,然后從 Bitmap 直接創(chuàng)建圖片产场。圖像的繪制通常是指用那些以 CG 開(kāi)頭的方法把圖像繪制到畫(huà)布中,然后從畫(huà)布創(chuàng)建圖片并顯示這樣一個(gè)過(guò)程舞竿。這個(gè)最常見(jiàn)的地方就是 [UIView drawRect:] 里面了京景。由于 CoreGraphic 方法通常都是線程安全的,所以圖像的繪制可以很容易的放到后臺(tái)線程進(jìn)行
GPU 資源消耗原因和解決方案
- 紋理的渲染:所有的 Bitmap骗奖,包括圖片确徙、文本、柵格化的內(nèi)容执桌,最終都要由內(nèi)存提交到顯存鄙皇,綁定為 GPU Texture。不論是提交到顯存的過(guò)程鼻吮,還是 GPU 調(diào)整和渲染 Texture 的過(guò)程,都要消耗不少 GPU 資源较鼓。
- 視圖的混合:如果視圖結(jié)構(gòu)過(guò)于復(fù)雜椎木,混合的過(guò)程也會(huì)消耗很多 GPU 資源。為了減輕這種情況的 GPU 消耗博烂,應(yīng)用應(yīng)當(dāng)盡量減少視圖數(shù)量和層次香椎,并在不透明的視圖里標(biāo)明 opaque 屬性以避免無(wú)用的 Alpha 通道合成
- 圖形的生成:CALayer 的 border、圓角禽篱、陰影畜伐、遮罩(mask),CASharpLayer 的矢量圖形顯示躺率,通常會(huì)觸發(fā)離屏渲染(offscreen rendering)玛界,而離屏渲染通常發(fā)生在 GPU 中万矾。
只有找到消耗的原因和對(duì)應(yīng)的過(guò)程,才能針對(duì)性的去優(yōu)化慎框。圓角l為啥會(huì)造成資源消耗良狈,消耗的又是什么資源?又怎么去優(yōu)化笨枯?