一、概念理解
OpenGL中雳灵,GPU屏幕渲染有以下兩種方式:
On-Screen Rendering
意為當(dāng)前屏幕渲染越锈,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行仅淑。
Off-Screen Rendering
意為離屏渲染晕拆,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作。
二嘀掸、離屏渲染的是是非非
相比于當(dāng)前屏幕渲染莫鸭,離屏渲染的代價是很高的,主要體現(xiàn)在兩個方面:
創(chuàng)建新緩沖區(qū)
要想進(jìn)行離屏渲染横殴,首先要創(chuàng)建一個新的緩沖區(qū)被因。
上下文切換
離屏渲染的整個過程卿拴,需要多次切換上下文環(huán)境:先是從當(dāng)前屏幕(On-Screen)切換到離屏(Off-Screen);等到離屏渲染結(jié)束以后梨与,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上有需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕堕花。而上下文環(huán)境的切換是要付出很大代價的。
三粥鞋、離屏渲染觸發(fā)方式
設(shè)置了以下屬性時缘挽,都會觸發(fā)離屏繪制:
shouldRasterize(光柵化)
masks(遮罩)
shadows(陰影)
edge antialiasing(抗鋸齒)
group opacity(不透明)
光柵化是柵格化,像素化的意思,就是把矢量圖形轉(zhuǎn)化為像素點(diǎn)的過程.
抗鋸齒就是消除圖像顯示中那些鋸齒化圖像.具體了解可以看這里
需要注意的是,如果shouldRasterize被設(shè)置成YES呻粹,在觸發(fā)離屏繪制的同時壕曼,會將光柵化后的內(nèi)容緩存起來,如果對應(yīng)的layer及其sublayers沒有發(fā)生改變等浊,在下一幀的時候可以直接復(fù)用腮郊。這將在很大程度上提升渲染性能。
而其它屬性如果是開啟的筹燕,就不會有緩存轧飞,離屏繪制會在每一幀都發(fā)生。
四撒踪、另一種特殊的“離屏渲染”
按照之前的說法过咬,如果將不在GPU的當(dāng)前屏幕緩沖區(qū)中進(jìn)行的渲染都稱為離屏渲染,那么就還有另一種特殊的“離屏渲染”方式: CPU渲染
制妄。
如果我們重寫了drawRect方法掸绞,并且使用任何Core Graphics的技術(shù)進(jìn)行了繪制操作,就涉及到了CPU渲染耕捞。整個渲染過程由CPU在App內(nèi) 同步地
完成衔掸,渲染得到的bitmap最后再交由GPU用于顯示畜普。
五费封、Instruments
Instruments的Core Animation工具中有幾個和離屏渲染相關(guān)的檢查選項(xiàng):
Color Offscreen-Rendered Yellow
開啟后會把那些需要離屏渲染的圖層高亮成黃色感挥,這就意味著黃色圖層可能存在性能問題。
Color Hits Green and Misses Red
如果shouldRasterize被設(shè)置成YES凌埂,對應(yīng)的渲染結(jié)果會被緩存,如果圖層是綠色诗芜,就表示這些緩存被復(fù)用瞳抓;如果是紅色就表示緩存會被重復(fù)創(chuàng)建,這就表示該處存在性能問題了伏恐。
六孩哑、如何抉擇
現(xiàn)在擺在我們面前得有三個選擇:當(dāng)前屏幕渲染、離屏渲染翠桦、CPU渲染横蜒,該用哪個呢胳蛮?這需要根據(jù)具體的使用場景來決定。
盡量使用當(dāng)前屏幕渲染
鑒于離屏渲染丛晌、CPU渲染可能帶來的性能問題仅炊,一般情況下,我們要盡量使用當(dāng)前屏幕渲染澎蛛。
離屏渲染 VS CPU渲染
由于GPU的浮點(diǎn)運(yùn)算能力比CPU強(qiáng)抚垄,CPU渲染的效率可能不如離屏渲染;但如果僅僅是實(shí)現(xiàn)一個簡單的效果谋逻,直接使用CPU渲染的效率又可能比離屏渲染好呆馁,畢竟離屏渲染要涉及到緩沖區(qū)創(chuàng)建和上下文切換等耗時操作。
總之毁兆,具體的選擇應(yīng)該由性能測試結(jié)果來決定浙滤。