UIKit性能优化学习

所有的目的都是为了提高界面的FPS,提升体验(特别是列表)。

1. 调试方法

  1. 使用Instruments中的Core Animation可以查看指定应用的FPS(选择app->开始录制)
  2. 调试APP时,在XCode的 Debug -> View Debugging -> Rendering 中切换选项。

2. 选项解释及优化方式

  1. Color Blended Layers:混合颜色图层
    即存在多个视图或图层叠加的情况,且至少最上面的图层存在透明区域,因此GPU需要将多个图层颜色进行混合计算,消耗性能。
    解决方法:

    1. 尽量让图层不要存在alpha透明度,UIImageView中的image也不要有,
    2. 显示中文的UILabel不仅需要设置bgColor,还需要额外设置masksToBounds为YES(单独不会触发离屏渲染)
  2. Color Hits Green and Missed Red
    即使用了光栅化技术(layer.shouldRasterize为YES):光栅化即将视图提前渲染成为bitmap,减少显示时的性能损耗。
    光栅化有效的layer(已使用bitmap显示)显示为绿色,否则为红色(还没有生成bitmap)。
    在带有复杂效果(如阴影等)的静态页面中,可以考虑使用此选项提升性能;
    对于UITableViewCell,由于更新频率高,不推荐使用(光栅化生成的bitmap位图只会存在100ms)。
    光栅化渲染时会触发离屏渲染。

  3. Color Copied Images
    证明GPU不支持此图片格式,需要CPU先进行转换后,再进行渲染工作。

  4. Color Misaligned Imaged
    证明UIImageView与显示的UIImage尺寸不符,需要额外进行图片的压缩或拉伸。
    不匹配的UIIMageView显示为黄色。
    解决方法:尽量获取尺寸相同的UIImage进行显示;或对UIImage进行预先裁剪,使其与UIImageView尺寸相同。

  5. Color Offscreen-Rendered Yellow
    离屏渲染,即GPU需要额外单独开启一个缓冲区进行渲染操作,结束后再将结果转回到原缓冲区。由于切换上下文耗费性能,因此要慎重使用。
    出现条件及建议:

    1. layer.cornerRadius = xx; layer.masksToBounds = YES; 二者同时使用即出现(因此直接设置圆角不会触发)。
    2. layer.shadow,即设置阴影。可以通过直接设置layer.shadowPath,提前指定阴影路径,避免实时计算产生的离屏渲染。
    3. layer.shouldRasterize = YES。即光栅化
    4. drawRect方法。因此尽量不要在此进行自定义视图绘制。
    5. layer.allowGroupOpacity和layer.allowEdgeAntialiasing。组透明度和边界抗锯齿
    6. layer.mask,即给layer添加遮罩层layer。
  6. Flash Updated Region
    重绘区域,显示为黄色,对应需要频繁重绘的区域(一般在地图上会有显示,如自身位置)。
    区域越少越好。

3. 参考资料:

  • Instruments性能优化-Core Animation
  • UIKit性能调优实战讲解

你可能感兴趣的:(UIKit性能优化学习)