off-screen rendering意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作
因為在幀緩衝區渲染乙個檢視到螢幕中就拋棄的機制.所以當我們有多組檢視需要組合隨後統一處理的時候.需要在屏緩衝區額外開闢乙個離屏的緩衝區去記錄這些檢視.隨後統一處理.最後渲染顯示出來
我們首先分析圓角產生離屏渲染的情況:
回顧一下.當我們給乙個檢視新增cornerradius時.是給哪些檢視新增了圓角?
蘋果官方的解答是:
即背景檢視以及邊框等檢視,不包含contents
檢視.所以當我們只設定cornerradius
時.不設定maskstobounds
為yes.檢視視覺上還是沒產生圓角
隨後我們對以下四種情況分別做圓角處理
a.按鈕檢視設定.並且設定圓角cornerradius
和裁剪maskstobounds
.會產生離屏渲染
b.按鈕檢視不設定.設定圓角cornerradius
和裁剪maskstobounds
.不會產生離屏渲染
c.檢視不設定背景色.設定圓角cornerradius
和裁剪maskstobounds
.不會產生離屏渲染
d.檢視設定背景色.設定圓角cornerradius
和裁剪maskstobounds
.會產生離屏渲染
相關**如下:
//設定會產生離屏渲染
uibutton * btn1 = [uibutton buttonwithtype:(uibuttontypecustom)];
btn1.frame = cgrectmake(100, 30, 100, 100);
[btn1 setimage:[uiimage imagenamed:@"wx20201127-92813"] forstate:uicontrolstatenormal];
[self.view addsubview:btn1];
btn1.layer.cornerradius = 50;
btn1.layer.maskstobounds = yes;
//只設定背景色不會產生離屏渲染
uibutton * btn2 = [uibutton buttonwithtype:(uibuttontypecustom)];
btn2.frame = cgrectmake(100, 150, 100, 100);
btn2.backgroundcolor = uicolor.graycolor;
[self.view addsubview:btn2];
btn2.layer.cornerradius = 50;
btn2.layer.maskstobounds = yes;
//對於來說.設定背景色以及就會產生離屏渲染.不設定就不會
uiimageview * img1 = [[uiimageview alloc]initwithimage:[uiimage imagenamed:@"wx20201127-92813"]];
img1.frame = cgrectmake(100, 270, 100, 100);
img1.backgroundcolor = uicolor.bluecolor;
img1.layer.cornerradius = 50;
img1.layer.maskstobounds = yes;
[self.view addsubview:img1];
uiimageview * img2 = [[uiimageview alloc]initwithimage:[uiimage imagenamed:@"wx20201127-92813"]];
img2.frame = cgrectmake(100, 390, 100, 100);
img2.layer.cornerradius = 50;
img2.layer.maskstobounds = yes;
[self.view addsubview:img2];
效果如下:
那什麼情況下會產生離屏渲染呢? 我們得出的表象結論是:
1.按鈕新增以後做圓角處理
2.檢視新增背景色和以後做圓角處理
接下來.我們將img2
進行改進: 給tempview
不加背景色不會產生離屏渲染.給tempview
新增背景色還是會產生離屏渲染
由此我們可以知道:當我們需要對多個圖層進行組合處理時就需要使用到離屏渲染技術.將多個圖層組合渲染完畢以後放到幀緩衝區.顯示到螢幕中
需要注意的是.以上是組合.而不是疊加.
那麼我們平時使用的檢視有哪些是組合.並且需要做離屏渲染的呢?
2.mask遮罩
3.光柵化
4.組合檢視設定透明度
5.陰影
6.漸變
7.繪製文字
8.系統毛玻璃效果
1.針對圓角的離屏渲染的情況.我們可以通過四種方案.
a.使用乙個鏤空圓角檢視蓋在上面
b.使用yyimage
裡面的圓角方法
c.通過calayer
與uibezierpath
結合使用的
uigraphicsbeginimagecontextwithoptions(size, false, scale)
uibezierpath.init(roundedrect: imgrect, cornerradius: self.layer.cornerradius).addclip()
self.image?.draw(in: imgrect)
self.image = uigraphicsgetimagefromcurrentimagecontext()
uigraphicsendimagecontext()
2.如果檢視不能被復用.並且不是靜態.需要被頻繁修改的情況不建議開啟光柵化.因為這樣會開啟離屏渲染會影響效率 3.盡量少使用或不使用透明度 4.非同步繪製.減少圖層 iOS之離屏渲染
on screen rendering 意為當前螢幕渲染,指的是gpu的渲染操作是在當前用於顯示的螢幕緩衝區中進行。off screen rendering 意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作。特殊的離屏渲染 如果將不在gpu的當前螢幕緩衝區中進行的渲染都稱為...
OpenGL基礎33 幀緩衝(上)之離屏渲染
在之前的章節,所有的物體都是中規中矩的顯示的,只考慮了光照對物體的影響,那假設想要顯示特殊的效果該怎麼操作呢?例如馬賽克風 將所有的物體都顯示為黑白色,就像上世紀80年代的灰白電視一樣,又或者說將整個場景渲染到一張泛黃的紙上以體現出年代感 當然是修改著色器,事實上,很多地方都是這麼做的,不過有些情況...
OpenGL於MFC使用彙總(三) 離屏渲染
有時直接建立opengl形式不適合,或者乾脆不同意然後建立乙個表單,正如我現在這個專案,建立窗體不顯示,它僅限於主框架。而我只是activex裡做一些相關工作,那僅僅能用到opengl的離屏渲染技術了 即不直接繪製到窗體上,而是繪製到一張點陣圖上。然後再次呼叫這張位圖實現興許的工作。以下就總結怎麼使...