性能注意点

1.rowatIndexPath的时候只创建cell,在displayCell时才绑定数据(未测试)
2.Color Blended Layers(混合过度绘制)
view:opaque设置为YES
color:不能包含透明度的颜色
imageView:自身不透明,不含透明通道的图片(cmd+i更多信息可以查看)
label:文字的label增加不透明的背景颜色,而且当UILabel内容为中文时,label的实际渲染区域要大于label的size,因为外围有了一圈的阴影,会出现图层混合:

label.layer.masksToBounds = YES;
label.backgroundColor = [UIColor whiteColor];

GPU的计算量:

 R = S + D*(1 - Sa)
R为混合之后的像素
S为当前view的像素
D为需要混合的view的像素
Sa为View的alpha值

图片圆角:

ios9以上(不会影响fps,且内存比绘制占用少,未测试)
- (void)layoutSubView{
  [super layoutSubView];
  self.imageView.layer.cornerRadius = xx.0f;
  self.imageView.layer.masksToBounds = YES;
}
ios9以下开启上下文绘制

//  borderW是圆形图片边框的宽度,borderColor是边框颜色,image需要裁剪为圆形的图片

+ (UIImage *)imageWithBorderW:(CGFloat)borderW borderColor:(UIColor *)color image:(UIImage *)image{
    if (!image) return nil;

    //1.生成一张图片,开启一个位图上下文(大小,图片的宽高 + 2 * 边框宽度)
    CGSize size = CGSizeMake(image.size.width + 2 *borderW, image.size.height + 2 *borderW);
    UIGraphicsBeginImageContext(size);

    //2.绘制一个大圆
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, size.width, size.height)];
    [color set];
    [path fill];

    //3.设置裁剪区域
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderW, borderW, image.size.width, image.size.height)];
    //3.1 把路径设置为裁剪区域
    [clipPath addClip];

    //4 把图片绘制到上下文
    [image drawAtPoint:CGPointMake(borderW, borderW)];

    //5.从上下文当中获取图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    //6.关闭上下文
    UIGraphicsEndImageContext();

    return newImage;
}

3.Color Hits Green and Misses Red(光栅化缓存图层的命中情况)
这个选项主要是检测我们有无滥用或正确使用layer的shouldRasterize属性.成功被缓存的layer会标注为绿色,没有成功缓存的会标注为红色。
很多视图Layer由于Shadow、Mask和Gradient等原因渲染很高,因此UIKit提供了API用于缓存这些Layer,self.layer.shouldRasterize = YES系统会将这些Layer缓存成Bitmap位图供渲染使用,如果失效时便丢弃这些Bitmap重新生成。图层Rasterization栅格化好处是对刷新率影响较小,坏处是删格化处理后的Bitmap缓存需要占用内存,而且当图层需要缩放时,要对删格化后的Bitmap做额外计算。 使用这个选项后时,如果Rasterized的Layer失效,便会标注为红色,如果有效标注为绿色。当测试的应用频繁闪现出红色标注图层时,表明对图层做的Rasterization作用不大。
在测试的过程中,第一次加载时,开启光栅化的layer会显示为红色,这是很正常的,因为还没有缓存成功。但是如果在接下来的测试,。例如我们来回滚动TableView时,我们仍然发现有许多红色区域,那就需要谨慎对待了

4.Color Copied Image (拷贝的图片)
这个选项主要检查我们有无使用不正确图片格式,由于手机显示都是基于像素的,所以当手机要显示一张图片的时候,系统会帮我们对图片进行转化。比如一个像素占用一个字节,故而RGBA则占用了4个字节,则1920 x 1080的图片占用了7.9M左右,但是平时jpg或者png的图片并没有那么大,因为它们对图片做了压缩,但是是可逆的。所以此时,如果图片的格式不正确,则系统将图片转化为像素的时间就有可能变长。而该选项就是检测图片的格式是否是系统所支持的,若是GPU不支持的色彩格式的图片则会标记为青色,则只能由CPU来进行处理。CPU被强制生成了一些图片,然后发送到渲染服务器,而不是简单的指向原始图片的的指针。我们不希望在滚动视图的时候,CPU实时来进行处理,因为有可能会阻塞主线程。

5.Color Immediately (颜色立即更新)
通常 Core Animation 以每秒10此的频率更新图层的调试颜色,对于某些效果来说,这可能太慢了,这个选项可以用来设置每一帧都更新(可能会影响到渲染性能,所以不要一直都设置它)

6.Color Misaligned Image (图片对齐方式)
这里会高亮那些被缩放或者拉伸以及没有正确对齐到像素边界的图片,即图片Size和imageView中的Size不匹配,会使图过程片缩放,而缩放会占用CPU,所以在写代码的时候保证图片的大小匹配好imageView

7.图片直接用SD缓存,最好别用jpeg格式,解压缩会大量消耗cpu


189A6591615D5046CF3BAC3609C50F31.jpg

8.fps监控

参考资料:

http://www.cocoachina.com/ios/20170105/18528.html
http://www.jianshu.com/p/1a624abd61ba
https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

推荐阅读更多精彩内容