前言
開發(fā)的過程遇到需要將很多很多的圖片枷莉,或者Label除破,或者Cell......切成圓角鼎姐,但是數(shù)量多的話郭赐,快速滑動的情況下手機會很卡很卡,尤其是在UITableView上面的時候。如下圖所示,下面的幀數(shù)會很低搅幅。
下圖可以看出幀數(shù)都是在40和其之下,這個幀率已經(jīng)讓人感覺到不那么順滑了阅束,如果低于40幀每秒,普通用戶就會察覺明顯的不流暢了,這個幀率如果出現(xiàn)在首屏茄唐,足以引領(lǐng)你的app進入垃圾級別的體驗了息裸。而且通過經(jīng)過我的測試,這里視圖和圓角的大小對幀率并沒有什么卵影響,數(shù)量才是真正影響幀數(shù)的關(guān)鍵沪编。同時UIView的layer.cornerRadius和layer.mask設(shè)置圓角進行比較我發(fā)現(xiàn),layer.cornerRadius實現(xiàn)圓角的性能是要比layer.mask要高一些呼盆。
原因
上面拖慢幀率的原因其實都是Off-Screen Rendering(離屏渲染)的原因。離屏渲染是個好東西蚁廓,但是頻繁發(fā)生離屏渲染是非常耗時的访圃。
解決方法
不要在滾動視圖使用cornerRadius或者mask。如果你非要作死怎么辦呢相嵌?那么這樣也可以拯救你:
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
這樣大部分情況下可以馬上挽救你的幀數(shù)在55幀每秒以上腿时。shouldRasterize = YES會使視圖渲染內(nèi)容被緩存起來况脆,下次繪制的時候可以直接顯示緩存,當然要在視圖內(nèi)容不改變的情況下批糟。
除了上面非要作死的人外格了,大家還是采取預(yù)先生成圓角圖片,并緩存起來這個方法才是比較好的手段徽鼎。預(yù)處理圓角圖片可以在后臺處理盛末,處理完畢后緩存起來,再在主線程顯示否淤,這就避免了不必要的離屏渲染了悄但。
另外也有在圖片上面覆蓋一個鏤空圓形圖片的方法可以實現(xiàn)圓形頭像效果,這個也是極為高效的方法石抡。缺點就是對視圖的背景有要求檐嚣,單色背景效果就最為理想。