iOS程序员的业余沙龙tomiOS菜鸟级开发

iOS图片设置圆角性能问题

2016-01-06  本文已影响10292人  齐滇大圣

一般我们在iOS开发的过程中设置圆角都是如下这样设置的。

 avatarImageView.clipsToBounds = YES;
 [avatarImageView.layer setCornerRadius:50];

 这样设置会触发离屏渲染,比较消耗性能。比如当一个页面上有十几头像这样设置了圆角
 会明显感觉到卡顿。

 注意:png图片UIImageView处理圆角是不会产生离屏渲染的。(ios9.0之后不会离屏渲染,ios9.0之前还是会离屏渲染)。

所有如果要高性能的设置圆角就需要找另外的方法了。下面是我找到的一些方法并写了一个例子。

IMG_1816.PNG

设置圆角的方法

问题:这种方法图片很多的话CUP消耗会高,内存占用也会暴增,而且后台线程绘制会比在主线程绘制占用更多的内存,不知道怎么解决?求大神指教!


使用Instruments的Core Animation查看性能

用Instruments测试得


问题回复:

可以用Instruments的 GPU Driver进行测试:

Instruments

图上面一部分是第一种方法的数据,下面一部分是第四种方法的数据。
第一种方法的Renderer Utilization 和 Tiler Utilization 基本在90%左右。帧率在20左右。
第四种方法的Renderer Utilization 和 Tiler Utilization 基本在20%左右。帧率接近60。
帧率越接近60滑动越顺畅。

  但是经过跟@nerozhao的讨论发现第四种Core Graphics绘制圆角会有大量的内存占用,
  而且每次绘制的时候CUP消耗会很大。

  由于@nerozhao使用了UITableView进行测试,因为UITableView滚动的时候是一直在
  复用的,UIImageView会重复绘制,所以会一直消耗CUP,然后你就能看的明显的卡顿。

  @nerozhao在UITableView里图片的绘制在后台线程进行绘制,解决了卡顿问题,但是
  由于是在后台线程的异步绘制所以在滚动的时候会看到图片先是正方形然后再变成圆形。

  而我使用的是UIScrollerView进行的测试,只有第一次绘制的时候会占用CUP资源,
  所以滑动的时候还是挺流畅的,但是内存消耗还是很大。如果是主线程绘制的话会阻塞一
  点时间的主线程,而后台线程绘制的话内存消耗会更大,特别容易崩溃。

所以第四种方法当图片特别多的时候很容易Received memory warning导致崩溃


解决问题参考文章

文章:
内存恶鬼drawRect - 谈画图功能的内存优化


最后

关于研究过程及各种设置圆角方法的例子测试对比 github源码
如果我的文章对你有帮助欢迎github Star
如果你有什么问题或者想交流的可以联系我。QQ:398411773

上一篇 下一篇

猜你喜欢

热点阅读