三、iOS離屏渲染的原理和使用

引言:設(shè)置圓角一定會出現(xiàn)離屏渲染嗎?

我們先看下面的四種情況,有哪些會出現(xiàn)離屏渲染呢

四種情況


我們運行模擬器,然后打開模擬器的Off-screen Rendered,屏幕顯示黃色則表示出現(xiàn)離屏渲染。這里我們看到了1,3出現(xiàn)了離屏渲染。在解釋這個問題之前我們先往下看。

運行結(jié)果

一、離屏渲染的原理和影響

1、離屏渲染產(chǎn)生的原因

正常渲染(遵循油畫算法):APP ->?Frame Buffer -> Display

圖層疊加的油畫算法:

圖層的疊加繪制大概遵循“畫家算法”。

油畫算法:先繪制場景中的離觀察者較遠的物體,再繪制較近的物體。


油畫算法


離屏渲染:APP -> Offscreen Buffer?-> Display

離屏渲染的邏輯

離屏渲染產(chǎn)生的原因:當(dāng)幀緩沖區(qū)的圖片不能直接展示在屏幕上,需要經(jīng)過其他的混合處理/計算(比如遮罩、半透明顏色混合),就必須把他們放到離屏緩沖區(qū),經(jīng)過計算后再展示在屏幕上。

3、離屏渲染的影響(離屏渲染會消耗性能,容易掉幀)

它要創(chuàng)建一個新的緩沖區(qū)(OffScreen Buffer,空間限制是屏幕像素的2.5倍),然后還需要上下文環(huán)境,在離屏渲染的整個過程中需要切換上下文環(huán)境,從當(dāng)前屏幕切換到離屏,等結(jié)束后,又將上下文切換回來。

二、離屏渲染的情況和解決辦法

1、圓角觸發(fā)離屏渲染的真正原因

當(dāng)我們設(shè)置layer.cornerRadius以及maskToBounds/clipsToBounds的時候

設(shè)置圓角

設(shè)置layer.cornerRadius只會設(shè)置backgroundcolor和border的圓角,不會設(shè)置content的圓角。如果再加上maskToBounds/clipsToBounds就會設(shè)置content的圓角。

本來遵循油畫算法從后往前繪制完一個圖層就可以丟棄了,但是現(xiàn)在因為要處理背景顏色和content的圓角(你沒辦法單獨對content進行圓角+裁剪設(shè)置,一定是結(jié)合了所在視圖的大小你才知道content要裁剪成什么樣子的)

我們需要將其依次在Offscreen Buffer中保存,對混合背景顏色+content的圖進行圓角處理,就觸發(fā)了離屏渲染。


2、離屏渲染的其他情況

1、mask遮罩(類似毛玻璃效果)-> 使用混合圖層,在layer上方疊加相應(yīng)mask形狀的半透明layer

2、edge antialiasing(抗鋸齒) ->?不設(shè)置?allowsEdgeAntialiasing?屬性為YES(默認(rèn)為NO)

3.?allowsGroupOpacity(組不透明,開啟CALayer的allowsGroupOpacity屬性后,子 layer 在視覺上的透明度的上限是其父 layer 的opacity(對應(yīng)UIView的alpha),并且從 iOS 7 以后默認(rèn)全局開啟了這個功能,這樣做是為了讓子視圖與其容器視圖保持同樣的透明度。) ->關(guān)閉?allowsGroupOpacity?屬性,按產(chǎn)品需求自己控制layer透明度

4.shadows(陰影)-> 設(shè)置陰影后,設(shè)置CALayer的?shadowPath.view.layer.shadowPath=[UIBezierPath pathWithCGRect:view.bounds].CGPath;

5、shouldRasterize?(光柵化)

三、怎么使用離屏渲染優(yōu)化性能

shouldRasterize = YES在其他屬性觸發(fā)離屏渲染的同時,會將光柵化后的內(nèi)容緩存起來,如果對應(yīng)的layer及其sublayers沒有發(fā)生改變,在下一幀的時候可以直接復(fù)用?!究梢蚤_啟“Color Hits Green and Misses Red”來檢查該場景下光柵化操作是否是一個好的選擇,綠色則表示光柵化圖層被復(fù)用,紅色則無】

shouldRasterize?(光柵化使用建議):

1.如果layer不需要復(fù)用,則沒有必要打開

2.如果layer不是靜態(tài)的,需要被頻繁修改,比如出于動畫之中,則開啟光柵華反而影響性能

3.離屏渲染緩存有時間限制,當(dāng)超過100ms,內(nèi)容沒有被使用就會被丟棄,無法復(fù)用

4.離屏渲染緩存有空間限制,超過屏幕像素的2.5倍則失效,并無法使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容