tablviewcell中圓角處理 離屏渲染問題

2021-07-30 18:15:36 字數 1267 閱讀 6842

@implementation

tableviewcell

- (void

)awakefromnib

當乙個cell有4個都進行圓角處理的話,幀數下降很快,

off-screen rendering

離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作。由上面的乙個結論檢視和圓角的大小對幀率並沒有什麼卵影響,數量才是傷害的核心輸出啊。可以知道離屏渲染耗時是發生在離屏這個動作上面,而不是渲染。為什麼離屏這麼耗時?原因主要有建立緩衝區和上下文切換。建立新的緩衝區代價都不算大,付出最大代價的是上下文切換。

上下文切換

上下文切換,不管是在gpu渲染過程中,還是一直所熟悉的程序切換,上下文切換在**都是乙個相當耗時的操作。首先我要儲存當前螢幕渲染環境,然後切換到乙個新的繪製環境,申請繪製資源,初始化環境,然後開始乙個繪製,繪製完畢後銷毀這個繪製環境,如需要切換到on-screen rendering或者再開始乙個新的離屏渲染重複之前的操作。 下圖描述了一次mask的渲染操作。

一次mask發生了兩次離屏渲染和一次主屏渲染。即使忽略昂貴的上下文切換,一次mask需要渲染三次才能在螢幕上顯示,這已經是普通檢視顯示3陪耗時,若再加上下文環境切換,一次mask就是普通渲染的30倍以上耗時操作。問我這個30倍以上這個資料怎麼的出來的?當我在cell的uiimageview的例項增加到150個,並去掉圓角的時候,幀數才跌至28幀每秒。雖然不是甚準確,但至少反映mask這個耗時是無mask操作的耗時的數十倍的。

那麼如何應對這個問題呢?不要在滾動檢視使用cornerradius或者mask。如果你非要作死怎麼辦呢?那麼這樣也可以拯救你:

1

2

self.layer.shouldrasterize = yes;

self.layer.rasterizationscale = [uiscreen mainscreen].scale;

這樣大部分情況下可以馬上挽救你的幀數在55幀每秒以上。shouldrasterize = yes會使檢視渲染內容被快取起來,下次繪製的時候可以直接顯示快取,當然要在檢視內容不改變的情況下。

還是採取預先生成圓角,並快取起來這個方法才是比較好的手段。預處理圓角可以在後台處理,處理完畢後快取起來,再在主線程顯示,這就避免了不必要的離屏渲染了。

另外也有在上面覆蓋乙個鏤空圓形的方法可以實現圓形頭像效果,這個也是極為高效的方法。缺點就是對檢視的背景有要求,單色背景效果就最為理想。

GDI 中的圓角矩形

gdi 是對gdi的乙個令人興奮的擴充套件,但由於某些原因,它沒有提供繪製圓角矩形的函式,雖然我們可以在gdi 中使用gdi中的函式,但這樣一來我們沒辦法在圓角矩形中使用gdi 中的紋理和透明色等新特性。怎麼辦?gdi 中有乙個graphicspath 的類,我們可以用它構造各種形狀並且可用任何畫刷...

GDI 中的圓角矩形

翻譯 李昊 原文出處 http www.codeproject.com 源 gdiplusroundedrect gdi 是對gdi的乙個令人興奮的擴充套件,但由於某些原因,它沒有提供繪製圓角矩形的函式,雖然我們可以在gdi 中使用gdi中的函式,但這樣一來我們沒辦法在圓角矩形中使用gdi 中的紋理...

圓角布局或者圓角按鈕

新增shape.xml encoding utf 8 xmlns android android color ffa500 android topleftradius 3dp android toprightradius 0dp android bottomrightradius 0dp andro...