1. 圖形渲染框架
下圖為 iOS APP
圖形渲染框架厅贪, APP
在顯示可視化的圖形時蠢护,使用到了 Core Animation
、 Core Graphics
养涮、 Core Image
等框架葵硕,這些框架在渲染圖形時,都需要通過 OpenGL ES / Metal
來驅(qū)動 GPU
進(jìn)行渲染與繪制贯吓。
1.1. UIKit
UIKit
是 iOS
開發(fā)者最常用的框架懈凹,里面提供了UIView
。
UIView
供開發(fā)者用來:
- 顯示界面(借助于
CALayer
) - 布局子視圖
- 處理用戶交互事件(繼承自
UIResponder
)悄谐。
1.2. Core Animation
Core Animation
源自于 Layer Kit, 是一個復(fù)合引擎,主要職責(zé)包含渲染(CALayer
)介评、構(gòu)建和實現(xiàn)動畫。CALayer
是用戶所能在屏幕上看到一切的基礎(chǔ)爬舰。
1.3. Core Graphics
Core Graphics
是基于Quartz 的高級繪圖引擎们陆,主要用于運(yùn)行時繪制圖像。其功能有繪制路徑情屹、顏色管理坪仇、漸變、陰影垃你、創(chuàng)建圖像烟很、圖像遮罩、PDF文檔創(chuàng)建顯示及分析蜡镶。
1.4. Core Image
Core Image
擁有一系列現(xiàn)成的圖像過濾器雾袱,可以對已存在的圖片進(jìn)行高效處理。大部分情況下官还,``Core Image ``` 是在GPU中完成工作芹橡,如果GPU忙,會使用CPU進(jìn)行處理望伦。
2. 三個框架間的依賴關(guān)系
Core Animation
林说、 Core Graphics
煎殷、 Core Image
這個三個框架間也存在著依賴關(guān)系。
上面提到CALayer
是用戶所能在屏幕上看到一切的基礎(chǔ)腿箩。所以Core Graphics
豪直、 Core Image
是需要依賴于CALayer
來顯示界面的。由于CALayer
又是Core Animation
框架提供的珠移,所以說Core Graphics
弓乙、 Core Image
是依賴于``Core Animation ```的。
上文還提到每一個 UIView 內(nèi)部都關(guān)聯(lián)一個 CALayer
圖層钧惧,即backing layer
暇韧,每一個 CALayer
都包含一個content
屬性指向一塊緩存區(qū),即backing store
浓瞪, 里面存放位圖(Bitmap)懈玻。iOS
中將該緩存區(qū)保存的圖片稱為寄宿圖
。
這個寄宿圖有兩個設(shè)置方式:
- 直接向
content
設(shè)置CGImage
圖片乾颁,這需要依賴Core Image
來提供圖片涂乌。 - 通過實現(xiàn)
UIView
的drawRect
方法自定義繪圖,這需要借助Core Graphics
來繪制圖形英岭,再由CALayer
生成圖片骂倘。
3. Core Animation 流水線
CALayer
是如何調(diào)用 GPU 并顯示可視化內(nèi)容的呢?下面我們就需要介紹一下 Core Animation 流水線的工作原理巴席。
事實上,app 本身并不負(fù)責(zé)渲染诅需,渲染則是由一個獨(dú)立的進(jìn)程負(fù)責(zé)漾唉,即 Render Server
進(jìn)程。
App 通過 IPC 將渲染任務(wù)及相關(guān)數(shù)據(jù)提交給 Render Server
堰塌。Render Server
處理完數(shù)據(jù)后赵刑,再傳遞至 GPU。最后由 GPU 調(diào)用 iOS 的圖像設(shè)備進(jìn)行顯示场刑。
Core Animation 流水線的詳細(xì)過程如下:
- 首先般此,由 app 處理事件(Handle Events),如:用戶的點擊操作牵现,在此過程中 app 可能需要更新 視圖樹铐懊,相應(yīng)地,圖層樹 也會被更新瞎疼。
- 其次科乎,app 通過 CPU 完成對顯示內(nèi)容的計算,如:視圖的創(chuàng)建贼急、布局計算茅茂、圖片解碼捏萍、文本繪制等。在完成對顯示內(nèi)容的計算之后空闲,app 對圖層進(jìn)行打包令杈,并在下一次 RunLoop 時將其發(fā)送至
Render Server
,即完成了一次Commit Transaction
操作碴倾。 -
Render Server
主要執(zhí)行 Open GL逗噩、Core Graphics 相關(guān)程序,并調(diào)用 GPU - GPU 則在物理層上完成了對圖像的渲染影斑。
- 最終给赞,GPU 通過 Frame Buffer、視頻控制器等相關(guān)部件矫户,將圖像顯示在屏幕上片迅。
對上述步驟進(jìn)行串聯(lián),它們執(zhí)行所消耗的時間遠(yuǎn)遠(yuǎn)超過 16.67 ms皆辽,因此為了滿足對屏幕的 60 FPS 刷新率的支持柑蛇,需要將這些步驟進(jìn)行分解,通過流水線的方式進(jìn)行并行執(zhí)行驱闷,如下圖所示耻台。
Commit Transaction
在 Core Animation 流水線中,app 調(diào)用 Render Server
前的最后一步 Commit Transaction 其實可以細(xì)分為 4 個步驟:
-
Layout
:主要進(jìn)行視圖構(gòu)建空另,包括:LayoutSubviews
方法的重載盆耽,addSubview:
方法填充子視圖等。 -
Display
:視圖繪制扼菠,這里僅僅是繪制寄宿圖摄杂,該過程使用CPU和內(nèi)存 -
Prepare
:階段屬于附加步驟,一般處理圖像的解碼和轉(zhuǎn)換等操作 -
Commit
:主要將圖層進(jìn)行打包循榆,并將它們發(fā)送至 Render Server析恢。該過程會遞歸執(zhí)行,因為圖層和視圖都是以樹形結(jié)構(gòu)存在秧饮。
參考文章:iOS 圖像渲染原理