前言
开发的过程遇到需要将很多很多的图片,或者Label,或者Cell......切成圆角,但是数量多的话,快速滑动的情况下手机会很卡很卡,尤其是在UITableView上面的时候。如下图所示,下面的帧数会很低。
下图可以看出帧数都是在40和其之下,这个帧率已经让人感觉到不那么顺滑了,如果低于40帧每秒,普通用户就会察觉明显的不流畅了,这个帧率如果出现在首屏,足以引领你的app进入垃圾级别的体验了。而且通过经过我的测试,这里视图和圆角的大小对帧率并没有什么卵影响,数量才是真正影响帧数的关键。同时UIView的layer.cornerRadius和layer.mask设置圆角进行比较我发现,layer.cornerRadius实现圆角的性能是要比layer.mask要高一些。
原因
上面拖慢帧率的原因其实都是Off-Screen Rendering(离屏渲染)的原因。离屏渲染是个好东西,但是频繁发生离屏渲染是非常耗时的。
解决方法
不要在滚动视图使用cornerRadius或者mask。如果你非要作死怎么办呢?那么这样也可以拯救你:
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
这样大部分情况下可以马上挽救你的帧数在55帧每秒以上。shouldRasterize = YES会使视图渲染内容被缓存起来,下次绘制的时候可以直接显示缓存,当然要在视图内容不改变的情况下。
除了上面非要作死的人外,大家还是采取预先生成圆角图片,并缓存起来这个方法才是比较好的手段。预处理圆角图片可以在后台处理,处理完毕后缓存起来,再在主线程显示,这就避免了不必要的离屏渲染了。
另外也有在图片上面覆盖一个镂空圆形图片的方法可以实现圆形头像效果,这个也是极为高效的方法。缺点就是对视图的背景有要求,单色背景效果就最为理想。