一、概念理解
OpenGL中丧凤,GPU屏幕渲染有以下兩種方式:
On-Screen Rendering
意為當(dāng)前屏幕渲染,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行榜配。
Off-Screen Rendering
意為離屏渲染逗栽,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個(gè)緩沖區(qū)進(jìn)行渲染操作祠汇。
二仍秤、離屏渲染的是是非非
相比于當(dāng)前屏幕渲染,離屏渲染的代價(jià)是很高的座哩,主要體現(xiàn)在兩個(gè)方面:
創(chuàng)建新緩沖區(qū)
要想進(jìn)行離屏渲染徒扶,首先要?jiǎng)?chuàng)建一個(gè)新的緩沖區(qū)粮彤。
上下文切換
離屏渲染的整個(gè)過程根穷,需要多次切換上下文環(huán)境:先是從當(dāng)前屏幕(On-Screen)切換到離屏(Off-Screen)姜骡;等到離屏渲染結(jié)束以后,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上有需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕屿良。而上下文環(huán)境的切換是要付出很大代價(jià)的圈澈。
三、離屏渲染觸發(fā)方式
設(shè)置了以下屬性時(shí)尘惧,都會(huì)觸發(fā)離屏繪制:
shouldRasterize(光柵化)
masks(遮罩)
shadows(陰影)
edge antialiasing(抗鋸齒)
group opacity(不透明)
需要注意的是康栈,如果shouldRasterize被設(shè)置成YES,在觸發(fā)離屏繪制的同時(shí)喷橙,會(huì)將光柵化后的內(nèi)容緩存起來啥么,如果對(duì)應(yīng)的layer及其sublayers沒有發(fā)生改變,在下一幀的時(shí)候可以直接復(fù)用贰逾。這將在很大程度上提升渲染性能悬荣。
而其它屬性如果是開啟的,就不會(huì)有緩存疙剑,離屏繪制會(huì)在每一幀都發(fā)生氯迂。
四、另一種特殊的“離屏渲染”
按照之前的說法言缤,如果將不在GPU的當(dāng)前屏幕緩沖區(qū)中進(jìn)行的渲染都稱為離屏渲染嚼蚀,那么就還有另一種特殊的“離屏渲染”方式:CPU渲染。
如果我們重寫了drawRect方法管挟,并且使用任何Core Graphics的技術(shù)進(jìn)行了繪制操作轿曙,就涉及到了CPU渲染。整個(gè)渲染過程由CPU在App內(nèi)同步地完成僻孝,渲染得到的bitmap最后再交由GPU用于顯示拳芙。
五、Instruments
Instruments的Core Animation工具中有幾個(gè)和離屏渲染相關(guān)的檢查選項(xiàng):
Color Offscreen-Rendered Yellow
開啟后會(huì)把那些需要離屏渲染的圖層高亮成黃色皮璧,這就意味著黃色圖層可能存在性能問題舟扎。
Color Hits Green and Misses Red
如果shouldRasterize被設(shè)置成YES,對(duì)應(yīng)的渲染結(jié)果會(huì)被緩存悴务,如果圖層是綠色睹限,就表示這些緩存被復(fù)用;如果是紅色就表示緩存會(huì)被重復(fù)創(chuàng)建讯檐,這就表示該處存在性能問題了羡疗。
六、如何抉擇
現(xiàn)在擺在我們面前得有三個(gè)選擇:當(dāng)前屏幕渲染别洪、離屏渲染叨恨、CPU渲染,該用哪個(gè)呢挖垛?這需要根據(jù)具體的使用場(chǎng)景來決定痒钝。
盡量使用當(dāng)前屏幕渲染
鑒于離屏渲染秉颗、CPU渲染可能帶來的性能問題,一般情況下送矩,我們要盡量使用當(dāng)前屏幕渲染蚕甥。
離屏渲染 VS CPU渲染
由于GPU的浮點(diǎn)運(yùn)算能力比CPU強(qiáng),CPU渲染的效率可能不如離屏渲染栋荸;但如果僅僅是實(shí)現(xiàn)一個(gè)簡(jiǎn)單的效果菇怀,直接使用CPU渲染的效率又可能比離屏渲染好,畢竟離屏渲染要涉及到緩沖區(qū)創(chuàng)建和上下文切換等耗時(shí)操作晌块。
總之爱沟,具體的選擇應(yīng)該由性能測(cè)試結(jié)果來決定。
七匆背、寫在最后
在趙巖同學(xué)的點(diǎn)撥下才理解了離屏渲染的概念钥顽,在此表示感謝!
如理解有誤還請(qǐng)大家指出靠汁。
參考文檔
Getting Pixels onto the Screen(中文翻譯版:繪制像素到屏幕上)
Designing for iOS: Graphics & Performance(中文翻譯版:iOS圖形處理和性能)
a performance minded take on ios design(中文翻譯版:iOS離屏繪制的性能和機(jī)制分析)