1:什么是離屏渲染俺叭?
當(dāng)image buffer需要進(jìn)行一些額外處理(如圓角铃拇、毛玻璃或其他濾鏡) 并且進(jìn)行額外處理后無法直接將數(shù)據(jù)傳遞至frame buffer進(jìn)行顯示,需要將處理后的數(shù)據(jù)暫存至offscreen buffer中俩垃,再由offscreen buffer 傳遞至 frame buffer 欠母, 最終顯示在屏幕上欢策。這個過程稱為離屏渲染。
2:如何使用Xcode查看哪些視圖發(fā)生了離屏渲染
在IPhone模擬器Debug菜單中勾選color off-screen Rendered 即可
3:觸發(fā)離屏渲染的兩個條件:
1:圖片(圖層)需要額外處理
2:數(shù)據(jù)需要暫存至offscreen buffer
4:離屏渲染的本質(zhì)
渲染中的常用算法:油畫算法
渲染操作都是由CoreAnimation 的 Render Server模塊赏淌,通過調(diào)用顯卡驅(qū)動所提供的OpenGL/Metal接口來執(zhí)行的。
通常對于每一層layer啄清,Render Server會遵循“畫家算法”六水,按次序輸出到frame buffer,后一層覆蓋前一層辣卒,就能得到最終的顯示結(jié)果
(iOS中掷贾,設(shè)備主存和GPU的顯存共享物理內(nèi)存,這樣可以省去一些數(shù)據(jù)傳輸?shù)拈_銷)
tips:如果在60Hz刷新率下荣茫,16ms內(nèi)無法完成渲染想帅,則會導(dǎo)致掉幀
5:什么時候會離屏渲染
提到為何會形成離屏渲染,可能很多人就會想到圓角加裁剪等啡莉。但是港准,并不是所有的圓角+裁剪都會產(chǎn)生離屏渲染的。圓角裁剪的時候咧欣,backgroundColor, contents, borderWidth, borderColor,如果都設(shè)置了這些屬性就會產(chǎn)生離屏渲染
1:一旦設(shè)置圓角+裁剪魄咕,如果視圖一定是有contents(圖片衩椒、繪制內(nèi)容哮兰、有圖像信息的子視圖),加上背景色或者邊框喝滞,就會產(chǎn)生離屏渲染阁将。
2:設(shè)置圓角+裁剪囤躁,加上子視圖位于裁剪區(qū)域,也會離屏渲染狸演。
3:僅有圓角+裁剪言蛇,和contents是不會離屏渲染的宵距。經(jīng)典例子就是【button setImage】的了,只需要對button.imageView.layer.cornerRadius和button.imageView.clipsToBounds進(jìn)行就不會離屏渲染满哪。
6:如何高效的使用離屏渲染
在無法避免的情況下劝篷,如何高效的使用離屏渲染
柵格化,在CALayer中有一個shouldRasterize屬性民宿,開啟后layer會啟動?xùn)鸥窕?br>
好處是通過開辟新內(nèi)存區(qū)域緩存位圖,提高性能活鹰。
之前看到的幾篇關(guān)于離屏渲染不錯的文章哈恰。記錄總結(jié)一下志群,筆記分享如上着绷。