四境蔼、iOS中圖形圖像渲染技術(shù)棧及流水線

1. 圖形渲染框架

下圖為 iOS APP 圖形渲染框架厅贪, APP 在顯示可視化的圖形時蠢护,使用到了 Core AnimationCore Graphics养涮、 Core Image 等框架葵硕,這些框架在渲染圖形時,都需要通過 OpenGL ES / Metal 來驅(qū)動 GPU 進(jìn)行渲染與繪制贯吓。

iOS圖形渲染框架.png

1.1. UIKit

UIKitiOS開發(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)UIViewdrawRect方法自定義繪圖,這需要借助 Core Graphics來繪制圖形英岭,再由CALayer生成圖片骂倘。
    框架間的依賴關(guān)系.png

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 圖像渲染原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末映挂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盗尸,更是在濱河造成了極大的恐慌柑船,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泼各,死亡現(xiàn)場離奇詭異椎组,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)历恐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門寸癌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专筷,“玉大人,你說我怎么就攤上這事蒸苇×子迹” “怎么了袄膏?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵柑肴,是天一觀的道長悠咱。 經(jīng)常有香客問我黄娘,道長,這世上最難降的妖魔是什么兆解? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任审洞,我火速辦了婚禮蚯瞧,結(jié)果婚禮上鸳兽,老公的妹妹穿的比我還像新娘掂铐。我一直安慰自己,他們只是感情好揍异,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布全陨。 她就那樣靜靜地躺著,像睡著了一般衷掷。 火紅的嫁衣襯著肌膚如雪辱姨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天戚嗅,我揣著相機(jī)與錄音雨涛,去河邊找鬼。 笑死懦胞,一個胖子當(dāng)著我的面吹牛替久,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播医瘫,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旧困!你這毒婦竟也來了醇份?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吼具,失蹤者是張志新(化名)和其女友劉穎僚纷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拗盒,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怖竭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陡蝇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痊臭。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡哮肚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出广匙,到底是詐尸還是另有隱情允趟,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布鸦致,位于F島的核電站潮剪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏分唾。R本人自食惡果不足惜抗碰,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绽乔。 院中可真熱鬧弧蝇,春花似錦、人聲如沸迄汛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞍爱。三九已至鹃觉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睹逃,已是汗流浹背盗扇。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留沉填,地道東北人疗隶。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像翼闹,于是被迫代替她去往敵國和親斑鼻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349