iOS 切圓角離屏渲染問題

2021-09-29 07:50:00 字數 1677 閱讀 7337

gpu螢幕渲染有兩種方式:

1、on-screen rendering(當前螢幕渲染)

指的是gpu的渲染操作是在當前顯示的螢幕緩衝區進行。

2、off-screen rendering(離屏渲染)

指的是gpu在當前螢幕緩衝區以外開闢乙個緩衝區進行渲染操作。

離屏渲染的代價很高體現在兩個方面,1、需要建立乙個新的緩衝區。2、上下文切換操作。

會引發離屏渲染的操作:

1、為圖層設定遮罩(layer.mask)

2、為圖層設定陰影(layer.shadow)

3、為圖層設定光柵化(layer.shouldrasterize = true)

4、設定layer.maskstobounds/view.clipstobounds屬性為true

5、使用cgcontext在drawrect方法中繪製會耗費更多的記憶體。

優化方案:

ios 9.0之前 uiimageview和uibutton設定圓角都會觸發離屏渲染。

ios 9.0之後 uibutton設定圓角會觸發離屏渲染,而uiimageview裡png並不會觸發離屏渲染了,如果設定其他陰影效果之類的還是會觸發離屏渲染的。

1、uiview(不包括子類)、uilabel、uitextfield、uitextview,直接使用layer.cornerradius 一行**就行。

2、uiimageview 推薦使用方法二

方法一:使用貝塞爾曲線和cashapelayer,生成乙個圓角layer,作為檢視的layer.mask ,該方法會觸發離屏渲染

- (cashapelayer *)creatshaplayerbounds:(cgrect)bounds

方法二:使用貝塞爾曲線繪製路徑,並切除多餘檢視,然後用view重新繪製(drawrect),該方法不會觸發離屏渲染,據說會重寫drawrect方法會耗費大量記憶體,本人用xcode測試並未發現。

- (void)drawimageview:(uiimageview *)imageview

方法三:使用貝塞爾曲線繪製路徑,用cgcontext重繪uiimage(drawinrect),該方法也不會觸發離屏渲染,但是記憶體會暴增。

3、uibutton

1、如果是簡單的設定背景色、新增邊框,可以使用上面的方法一,用貝塞爾曲線和cashaplayer,然後將cashaplayer新增到button的layer層上。

2、如果是設定image,可以使用上面的方法三,drawinrect重新繪製uiimage。

3、也可以用乙個中間透明,四周跟背景色相同的貼在button。

4、或者直接讓ui切好,減少客戶端**量。

3、陰影(shadow)優化

通過設定shadowpath來代替shadowoffset能大幅提高效能。

imageview.layer.shadowcolor = [uicolor graycolor].cgcolor;

imageview.layer.shadowopacity = 0;

imageview.layer.shadowradius = 2.0;

uibezierpath *path = [uibezierpath bezierpathwithrect:imageview.frame];

imageview.layer.shadowpath = path.cgpath;

iOS圓角避免離屏渲染

寫在前面 已經整理到nxlib的 nx circleview,nx circleimage 中,在列表中使用圓角時建議使用這個方式.參考閱讀 閱讀原文 ios可自選切割角的圓角切割工具 避免離屏渲染 skarchcutter 簡述 skarchcutter,是乙個可自選切割角的圓角切割工具,同時支援...

iOS之離屏渲染

on screen rendering 意為當前螢幕渲染,指的是gpu的渲染操作是在當前用於顯示的螢幕緩衝區中進行。off screen rendering 意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作。特殊的離屏渲染 如果將不在gpu的當前螢幕緩衝區中進行的渲染都稱為...

iOS 離屏渲染研究

gpu渲染機制 gpu螢幕渲染有以下兩種方式 離屏渲染的觸發方式 設定了以下屬性時,都會觸發離屏繪製 其中shouldrasterize 光柵化 是比較特別的一種 光柵化概念 將圖轉化為乙個個柵格組成的圖象。光柵化特點 每個元素對應幀緩衝區中的一畫素。shouldrasterize yes在其他屬性...