高效使用圓角
1框往、在默認(rèn)情況下匙赞,圓角屬性只會(huì)影響視圖的背景顏色和border屡穗,對(duì)于UILabel這樣內(nèi)部還有子視圖的控件就無能為力了。
2番枚、Color offScreen Rendered Yellow 離屏渲染法严,離屏渲染并非由設(shè)置圓角導(dǎo)致的,通過控制變量的方法很容易得出葫笼,UIView只是設(shè)置了cornerRadius,并沒有出現(xiàn)離屏渲染深啤。
3、maskToBounds會(huì)導(dǎo)致離屏渲染路星,從而影響性能溯街,在iPhone6上,即使出現(xiàn)了17個(gè)帶圓角的視圖奥额,滑動(dòng)時(shí)的幀數(shù)依然在58~59fps左右波動(dòng)苫幢,然而访诱,這并非說明iOS9做了什么特殊優(yōu)化垫挨,或者是離屏渲染的影響不大,其主要原因在于圓角不夠多触菜。當(dāng)我將一個(gè)UIImageView也設(shè)置成圓角九榔,也就是屏幕上的圓角視圖達(dá)到了34個(gè)時(shí),fps大幅度下降,大約只有33個(gè)左右哲泊,基本上已經(jīng)達(dá)到了影響用戶體驗(yàn)的方為剩蟀,因此,一切不講一句話的優(yōu)化都是耍流氓切威,如果你的圓角視圖不多育特,cell不復(fù)雜,就不要費(fèi)力氣折騰了先朦。
4缰冤、應(yīng)該盡量避免重寫drawRect方法,不恰當(dāng)?shù)脑囉眠@個(gè)方法會(huì)導(dǎo)致內(nèi)存暴增喳魏,舉個(gè)例子棉浸,iPhone6上與屏幕等大的UIView,即使重寫一個(gè)空的drawRect方法刺彩,它也至少占用75011344字節(jié)=3.4MB的內(nèi)存迷郑。
5、在iPhone6上创倔, 空的嗡害、與屏幕等大的視圖重寫drawRect方法會(huì)消耗5.2MB內(nèi)存,總之畦攘,能避免重寫drawRect方法就盡可能避免就漾。
6、label等內(nèi)部還有子視圖的控件念搬,cornerRadius屬性設(shè)置無效抑堡,除非設(shè)置離屏渲染即設(shè)置masksToBounds為true,這樣設(shè)置的代價(jià)是消耗內(nèi)存
離屏渲染
1朗徊、OpenGL中首妖,GPU屏幕渲染有一下兩種方式:
on Screen Rendering 意為當(dāng)前屏幕渲染,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行爷恳。
off Screen Rendering意為離屏渲染有缆,指的是GPU在當(dāng)前屏幕緩沖區(qū)意外開辟一個(gè)緩沖區(qū)進(jìn)行渲染操作。
2温亲、相比于當(dāng)前屏幕渲染棚壁,離屏渲染的代價(jià)是很高的,主要體現(xiàn)在:
創(chuàng)建新緩沖區(qū)栈虚,上下文切換離屏渲染的整個(gè)過程袖外,需要多次切換上下文環(huán)境,先從當(dāng)前屏幕切換到離屏魂务,等到離屏渲染結(jié)束后曼验,將離屏緩沖區(qū)的渲染結(jié)果顯示到屏幕上有需要將上下文環(huán)境從離屏切換到當(dāng)前屏幕泌射。從上下文環(huán)境的切換是要付出很大的代價(jià)的。