1. 圖形渲染框架
下圖為 iOS APP
圖形渲染框架, APP
在顯示可視化的圖形時,使用到了 Core Animation
、 Core Graphics
、 Core Image
等框架,這些框架在渲染圖形時,都需要通過 OpenGL ES / Metal
來驅(qū)動 GPU
進行渲染與繪制。
1.1. UIKit
UIKit
是 iOS
開發(fā)者最常用的框架,里面提供了UIView
。
UIView
供開發(fā)者用來:
- 顯示界面(借助于
CALayer
) - 布局子視圖
- 處理用戶交互事件(繼承自
UIResponder
)。
1.2. Core Animation
Core Animation
源自于 Layer Kit, 是一個復合引擎,主要職責包含渲染(CALayer
)、構(gòu)建和實現(xiàn)動畫。CALayer
是用戶所能在屏幕上看到一切的基礎。
1.3. Core Graphics
Core Graphics
是基于Quartz 的高級繪圖引擎,主要用于運行時繪制圖像。其功能有繪制路徑、顏色管理、漸變、陰影、創(chuàng)建圖像、圖像遮罩、PDF文檔創(chuàng)建顯示及分析。
1.4. Core Image
Core Image
擁有一系列現(xiàn)成的圖像過濾器,可以對已存在的圖片進行高效處理。大部分情況下,``Core Image ``` 是在GPU中完成工作,如果GPU忙,會使用CPU進行處理。
2. 三個框架間的依賴關系
Core Animation
、 Core Graphics
、 Core Image
這個三個框架間也存在著依賴關系。
上面提到CALayer
是用戶所能在屏幕上看到一切的基礎。所以Core Graphics
、 Core Image
是需要依賴于CALayer
來顯示界面的。由于CALayer
又是Core Animation
框架提供的,所以說Core Graphics
、 Core Image
是依賴于``Core Animation ```的。
上文還提到每一個 UIView 內(nèi)部都關聯(lián)一個 CALayer
圖層,即backing layer
,每一個 CALayer
都包含一個content
屬性指向一塊緩存區(qū),即backing store
, 里面存放位圖(Bitmap)。iOS
中將該緩存區(qū)保存的圖片稱為寄宿圖
。
這個寄宿圖有兩個設置方式:
- 直接向
content
設置CGImage
圖片,這需要依賴Core Image
來提供圖片。 - 通過實現(xiàn)
UIView
的drawRect
方法自定義繪圖,這需要借助Core Graphics
來繪制圖形,再由CALayer
生成圖片。
框架間的依賴關系.png
3. Core Animation 流水線
CALayer
是如何調(diào)用 GPU 并顯示可視化內(nèi)容的呢?下面我們就需要介紹一下 Core Animation 流水線的工作原理。
事實上,app 本身并不負責渲染,渲染則是由一個獨立的進程負責,即 Render Server
進程。
App 通過 IPC 將渲染任務及相關數(shù)據(jù)提交給 Render Server
。Render Server
處理完數(shù)據(jù)后,再傳遞至 GPU。最后由 GPU 調(diào)用 iOS 的圖像設備進行顯示。
Core Animation 流水線的詳細過程如下:
- 首先,由 app 處理事件(Handle Events),如:用戶的點擊操作,在此過程中 app 可能需要更新 視圖樹,相應地,圖層樹 也會被更新。
- 其次,app 通過 CPU 完成對顯示內(nèi)容的計算,如:視圖的創(chuàng)建、布局計算、圖片解碼、文本繪制等。在完成對顯示內(nèi)容的計算之后,app 對圖層進行打包,并在下一次 RunLoop 時將其發(fā)送至
Render Server
,即完成了一次Commit Transaction
操作。 -
Render Server
主要執(zhí)行 Open GL、Core Graphics 相關程序,并調(diào)用 GPU - GPU 則在物理層上完成了對圖像的渲染。
- 最終,GPU 通過 Frame Buffer、視頻控制器等相關部件,將圖像顯示在屏幕上。
對上述步驟進行串聯(lián),它們執(zhí)行所消耗的時間遠遠超過 16.67 ms,因此為了滿足對屏幕的 60 FPS 刷新率的支持,需要將這些步驟進行分解,通過流水線的方式進行并行執(zhí)行,如下圖所示。
Commit Transaction
在 Core Animation 流水線中,app 調(diào)用 Render Server
前的最后一步 Commit Transaction 其實可以細分為 4 個步驟:
-
Layout
:主要進行視圖構(gòu)建,包括:LayoutSubviews
方法的重載,addSubview:
方法填充子視圖等。 -
Display
:視圖繪制,這里僅僅是繪制寄宿圖,該過程使用CPU和內(nèi)存 -
Prepare
:階段屬于附加步驟,一般處理圖像的解碼和轉(zhuǎn)換等操作 -
Commit
:主要將圖層進行打包,并將它們發(fā)送至 Render Server。該過程會遞歸執(zhí)行,因為圖層和視圖都是以樹形結(jié)構(gòu)存在。
參考文章:iOS 圖像渲染原理