@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...