美文网首页Objective-C
UIKit性能优化学习

UIKit性能优化学习

作者: 我才是臭吉吉 | 来源:发表于2019-09-27 06:57 被阅读0次

    所有的目的都是为了提高界面的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. 参考资料:

    相关文章

      网友评论

        本文标题:UIKit性能优化学习

        本文链接:https://www.haomeiwen.com/subject/nffnyctx.html