Core Animation 渲染流程
閱讀時(shí)間3-5分鐘
前言
依舊老規(guī)矩帶著問題來閱讀
CoreAnimation 的職責(zé)是什么木缝?
流程圖
這是蘋果官方提供的大量圖片中的一張
流程圖的解讀
整個(gè)流程一共有下面幾個(gè)步驟:
Handle Events
這個(gè)過程中會先處理交互事件怀大,這個(gè)過程中有可能會需要改變頁面的布局和界面層次识樱;這個(gè)很好理解州袒。-
Commit Transaction
此時(shí)app會通過CPU處理顯示內(nèi)容的前置計(jì)算勋功,比如布局計(jì)算、圖片解碼等任務(wù)上煤,接下來會進(jìn)行詳細(xì)的講解休玩。之后將計(jì)算好的圖層進(jìn)行打包發(fā)給 Render Server。
Commit Transaction 這部分中主要進(jìn)行的是:Layout劫狠、Display拴疤、Prepare、Commit 等四個(gè)具體的操作独泞。- Layout 構(gòu)建視圖呐矾,計(jì)算視圖布局
-
Display 繪制視圖層(下面提到的圖層)
這里需要注意的是
Core Graphics
,這個(gè)階段主要是通過它來完成的,但并不是真正的顯示阐肤,而是得到圖元 primitives 數(shù)據(jù)凫佛。這部分是在CPU中完成的,而后續(xù)會通過GPU來得到位圖(bitmap)
但是有一個(gè)例外:drawRect:
如果開發(fā)者重寫了這個(gè)方法就會在CPU中將layer通過Core Graphics
直接處理成bitmap,就不會在通過GPU來完成bitmap的渲染孕惜,這里就涉及到一個(gè)概念:離屏渲染
- Prepare 圖片解碼和轉(zhuǎn)換
- Commit 將處理好的圖層打包發(fā)送給Decode
Decode
打包好的圖層被傳輸?shù)?Render Server
之后愧薛,首先會進(jìn)行解碼。注意完成解碼之后需要等待下一個(gè) RunLoop 才會執(zhí)行將具體操作繪制(OpenGL/Metal的操作)轉(zhuǎn)發(fā)給下個(gè)流程Draw Calls
衫画。
以上三個(gè)步驟都是在CPU中完成的毫炉。Draw Calls
解碼完成后,Core Animation 會調(diào)用下層渲染框架(比如 OpenGL 或者 Metal)的方法進(jìn)行頂點(diǎn)著色器削罩、圖元裝配瞄勾、光柵化、片元著色器弥激、混合等渲染工作进陡,進(jìn)而調(diào)用到 GPU。
Render
這一階段主要由 GPU 進(jìn)行渲染微服。Display
顯示階段趾疚,需要等 render 結(jié)束的下一個(gè) RunLoop 觸發(fā)顯示。
更多和渲染有關(guān)的可以查看: iOS 渲染原理解析