所有的目的都是为了提高界面的FPS,提升体验(特别是列表)。
1. 调试方法
- 使用Instruments中的Core Animation可以查看指定应用的FPS(选择app->开始录制)
- 调试APP时,在XCode的 Debug -> View Debugging -> Rendering 中切换选项。
2. 选项解释及优化方式
-
Color Blended Layers:混合颜色图层
即存在多个视图或图层叠加的情况,且至少最上面的图层存在透明区域,因此GPU需要将多个图层颜色进行混合计算,消耗性能。
解决方法:- 尽量让图层不要存在alpha透明度,UIImageView中的image也不要有,
- 显示中文的UILabel不仅需要设置bgColor,还需要额外设置masksToBounds为YES(单独不会触发离屏渲染)
-
Color Hits Green and Missed Red
即使用了光栅化技术(layer.shouldRasterize为YES):光栅化即将视图提前渲染成为bitmap,减少显示时的性能损耗。
光栅化有效的layer(已使用bitmap显示)显示为绿色,否则为红色(还没有生成bitmap)。
在带有复杂效果(如阴影等)的静态页面中,可以考虑使用此选项提升性能;
对于UITableViewCell,由于更新频率高,不推荐使用(光栅化生成的bitmap位图只会存在100ms)。
光栅化渲染时会触发离屏渲染。 -
Color Copied Images
证明GPU不支持此图片格式,需要CPU先进行转换后,再进行渲染工作。 -
Color Misaligned Imaged
证明UIImageView与显示的UIImage尺寸不符,需要额外进行图片的压缩或拉伸。
不匹配的UIIMageView显示为黄色。
解决方法:尽量获取尺寸相同的UIImage进行显示;或对UIImage进行预先裁剪,使其与UIImageView尺寸相同。 -
Color Offscreen-Rendered Yellow
离屏渲染,即GPU需要额外单独开启一个缓冲区进行渲染操作,结束后再将结果转回到原缓冲区。由于切换上下文耗费性能,因此要慎重使用。
出现条件及建议:- layer.cornerRadius = xx; layer.masksToBounds = YES; 二者同时使用即出现(因此直接设置圆角不会触发)。
- layer.shadow,即设置阴影。可以通过直接设置layer.shadowPath,提前指定阴影路径,避免实时计算产生的离屏渲染。
- layer.shouldRasterize = YES。即光栅化
- drawRect方法。因此尽量不要在此进行自定义视图绘制。
- layer.allowGroupOpacity和layer.allowEdgeAntialiasing。组透明度和边界抗锯齿
- layer.mask,即给layer添加遮罩层layer。
-
Flash Updated Region
重绘区域,显示为黄色,对应需要频繁重绘的区域(一般在地图上会有显示,如自身位置)。
区域越少越好。
网友评论