1匣距、什么是離屏渲染?
1)On-Screen Rendering
意為當(dāng)前屏幕渲染哎壳,指的是 GPU 的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進行毅待。
2)Off-Screen Rendering
意為離屏渲染,指的是 GPU 在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作归榕。
2尸红、離屏渲染觸發(fā)的時機
當(dāng)圖層屬性的混合體被指定為在未預(yù)合成之前不能直接在屏幕中繪制時,屏幕外渲染就被喚起了刹泄。屏幕外渲染并不意味著軟件繪制驶乾,但是它意味著圖層必須在被顯示之前在一個屏幕外上下文中被渲染(不論 CPU 還是 GPU)。
離屏渲染可以被 Core Animation 自動觸發(fā)循签,或者被應(yīng)用程序強制觸發(fā)级乐。屏幕外的渲染會合并/渲染圖層樹的一部分到一個新的緩沖區(qū),然后該緩沖區(qū)被渲染到屏幕上县匠。
這里提到的 offscreen rendering 主要講的是通過 GPU 執(zhí)行的 offscreen,事實上還有的 offscreen rendering 是通過 CPU 來執(zhí)行的风科。
如果我們重寫了 drawRect 方法,并且使用任何 Core Graphics 的技術(shù)進行了繪制操作乞旦,就涉及到了 CPU 渲染贼穆。整個渲染過程由 CPU 在 App 內(nèi)同步地完成,渲染得到的 bitmap 最后再交由 GPU 用于顯示兰粉。其它類似 cornerRadios, masks, shadows 等觸發(fā)的 offscreen 是基于 GPU 的故痊。
PS:CoreGraphic 通常是線程安全的,所以可以進行異步繪制玖姑,顯示的時候再放回主線程愕秫。
2.1 觸發(fā)離屏渲染的方式
1、圓角(當(dāng)和maskToBounds一起使用時)
2焰络、圖層蒙版
3戴甩、陰影
4、光柵化:設(shè)置 shouldRasterize = YES 便會觸發(fā)光柵化
光柵化的概念:
將圖轉(zhuǎn)化為一個個柵格組成的圖像闪彼,即從矢量的點線面的描述甜孤,變成像素的描述。
光柵化是一種特殊的離屏渲染畏腕,它的主要工作量集中在?CPU?上缴川,而不是前文介紹的那種 GPU 單獨開辟緩存進行圖形生成計算,并且 CPU 光柵化完成后會將該 bitmap 緩存于本地描馅,以便重復(fù)利用把夸,它在形式上也是一種離屏渲染,但不屬于 OpenGL 名字中特指的那種 GPU 新開 buffer 生成圖形的過程流昏。?
光柵化注意兩點:
1扎即、不要過度使用,系統(tǒng)限制了緩存的大小為 2.5X Screen Size.
如果過度使用,超出緩存之后,同樣會造成大量的 offscreen 渲染。
2况凉、被光柵化的圖片如果超過?100ms?沒有被使用,則會被移除
因此我們應(yīng)該只對連續(xù)不斷使用的圖片進行緩存谚鄙。對于不常使用的圖片緩存是沒有意義,且耗費資源的。
注:對于那些需要動畫而且要在屏幕外渲染的圖層來說刁绒,你可以用 CAShapeLayer闷营,contentsCenter 或者shadowPath 來獲得同樣的表現(xiàn)而且較少地影響到性能。
3知市、為什么要盡量避免離屏渲染?
一般導(dǎo)致圖形性能的問題大部分都出在了 offscreen rendering, 因此如果我們發(fā)現(xiàn)列表滾動不流暢,動畫卡頓等問題,就可以想想和找出我們哪部分代碼導(dǎo)致了大量的 offscreen 渲染。
離屏渲染主要在兩個地方開銷較大:
1俩功、創(chuàng)建新緩沖區(qū)
要想進行離屏渲染憾儒,首先要創(chuàng)建一個新的緩沖區(qū)。
2跟啤、上下文切換
離屏渲染的整個過程诽表,需要多次切換上下文環(huán)境:先是從當(dāng)前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結(jié)束以后隅肥,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上竿奏,又需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕。而上下文環(huán)境的切換是要付出很大代價的腥放。
4泛啸、硬件加速
硬件加速是指用到了 GPU 的 API,以下這些情況不會用到硬件加速
1)使用 CGContexts 繪制的圖形
2)所有在 drawRect 中完成的圖形繪制秃症。
3)shouldRasterize 屬性為 YES 的 CALayer(在 CPU 渲染)候址。
4)用到了 mask 或 drop shadow 的 CALayer。
5)Text (包括UILabels, CATextLayers, Core Text, 等等)
參考文檔:iOS圖形原理與離屏渲染