Core Animation渲染流水線(xiàn)工作流程
我們的App本身是不負(fù)責(zé)渲染的够掠,渲染由Render Server進(jìn)程來(lái)完成。
- App處理事件盅惜。這個(gè)過(guò)程會(huì)更新圖層樹(shù)伐割。
- App使用CPU完成計(jì)算,打包發(fā)給Render Server笙隙。這些計(jì)算包括圖層創(chuàng)建洪灯、布局、文本繪制竟痰、圖片解碼等签钩。
- Render Server 調(diào)用OpenGL、Core Graphics凯亮,使用GPU完成圖像的渲染边臼。
- GPU通過(guò)Frame Buffer(幀緩沖區(qū))和視頻控制器等將圖像在屏幕上顯示。
離屏渲染觸發(fā)原理
以上案例代碼中假消,模擬器打開(kāi)了離屏渲染展示開(kāi)關(guān)“Color Off-screen Rendered”柠并。左側(cè)一列是三個(gè)UIImageView,右側(cè)一列是三個(gè)UIButton富拗【视瑁可以看到兩列的第三個(gè)控件都發(fā)生了離屏渲染。
-
普通渲染
當(dāng)我們?yōu)橐粋€(gè)UIButton設(shè)置一個(gè)背景顏色和一個(gè)圖片啃沪,渲染時(shí)粘拾,會(huì)按圖層依次存入幀緩沖區(qū)。
-
渲染流程:
-
離屏渲染
當(dāng)我們?yōu)橐粋€(gè)UIButton設(shè)置一個(gè)背景顏色和一個(gè)圖片创千,同時(shí)設(shè)置了圓角和maskToBounds缰雇,渲染時(shí),會(huì)將圖層存入離屏渲染緩沖區(qū)觸發(fā)離屏渲染追驴。當(dāng)設(shè)置了maskToBounds時(shí)械哟,要對(duì)背景圖層和內(nèi)容圖層同時(shí)進(jìn)行圓角裁剪,這時(shí)就不能按照普通的渲染流程一層一層的顯示并丟棄殿雪。 -
渲染流程:
常見(jiàn)的觸發(fā)離屏渲染情況
App需要進(jìn)行額外的渲染和合并時(shí)會(huì)觸發(fā)離屏渲染暇咆。一方面,設(shè)置了特殊的效果丙曙,一次性不能完成渲染時(shí)爸业,系統(tǒng)會(huì)自動(dòng)觸發(fā)離屏渲染,使用Off-screen Buffer保存中間狀態(tài)亏镰;另一方面扯旷,出于效率優(yōu)勢(shì)的考量,希望復(fù)用的效果可以通過(guò)設(shè)置layer的shouldRasterize(光柵化)屬性為yes進(jìn)行復(fù)用索抓。需要注意的是钧忽,離屏渲染緩沖區(qū)是有空間大小限制的某抓,可以存儲(chǔ)屏幕像素點(diǎn)數(shù)量等2.5倍,超過(guò)空間時(shí)離屏渲染無(wú)效惰瓜。當(dāng)存入離屏渲染緩沖區(qū)100ms內(nèi)沒(méi)有被使用,也會(huì)被丟棄汉矿。
- 使用了mask的layer(layer.mask)
- 需要進(jìn)行裁剪的layer(layer.maskToBounds)
- 設(shè)置了組透明度崎坊,并且透明度不為1。(layer.allowsGroupOpacity/ layer.opacity )
- 添加了投影的 layer (layer.shadow*)
- 采用了光柵化的 layer (layer.shouldRasterize)
- 繪制了文字的 layer (UILabel, CATextLayer, Core Text 等)
離屏渲染的缺點(diǎn)
- 需要使用額外的存儲(chǔ)空間捞蚂,可能會(huì)造成內(nèi)存壓力乐横。
- 使用離屏渲染緩沖區(qū)存儲(chǔ)的圖層最終還是要通過(guò)放入幀緩沖區(qū)最終顯示在屏幕上掌唾,從離屏渲染緩沖區(qū)進(jìn)入幀緩沖區(qū)也耗費(fèi)時(shí)間,造成性能問(wèn)題男翰,有掉幀的可能。