say your Highlights

此时此刻玻璃杯 碎了 岁岁平安。。。。开启自我之旅

对于uitableview 优化 有研究
第一点是cell identifier 复用
第二点 对于各cell不同 高度的计算 rowHeight 的设置 以及 estimatedRowHeight (估算高度的开启)
第三点 ios8以后 self-sizing cell ((( 旨在让 cell 自己负责自己的高度计算,使用 frame layout 和 auto layout 都可以享受到)))

具有动态内容的cell

frame时代通过数据 反算高度(吐槽 各种margin 并且耦合了屏幕的宽度等)

AutoLayout 提供systemLayoutSizeFittingSizeAPI  在 contentView 中设置约束后,就能计算出准确的值。
 
第四点 rowHeight  的与缓存机制
    采用的Runloop 利用runloop 空闲时 执行缓存任务(当用户正在滑动列表时显然不应该执行计算任务影响滑动体验)

RunLoopMode 的概念
UITrackingRunLoopMode 接受滑动手势和处理滑动事件(包括减速和弹簧效果)
NSDefaultRunLoopModel (一进入程序就进入这个 状态) 默认状态 空闲状态
NSRunLoopCommonModes (以上两种结合)

NSTimer 完全依赖RunLoop工作

tableview 延迟加载图片思路 在NSDefaultRunLoopModel 时设置图片 防止卡顿。delegate 监听滑动的时候不去设置。

对于UIKite性能调优
common + I 打开 Instrument 选择
core animation

==图层混合 调试项Color Blended Layers 很多控件opaque设置为yes(默认为yes) 目的就是避免图层混合。 关注图像本身的性质.
透明会出现 图层混合 如果不设置backgroundColor 控件依然被认为透明。

===光栅化 调试选项 Color Hits Green and Misses Red(光栅化是将一个layer预先渲染成位图(bitmap),然后加入缓存中)在缓存中是绿色。提高性能。 缓存有效期问题(100ms)

用不用?
光栅化的缓存机制是一把双刃剑,先写入缓存再读取有可能消耗较多的时间。因此光栅化仅适用于较复杂的、静态的效果。通过Instrument的调试发现,这里使用光栅化经常出现未命中缓存的情况,如果没有特殊需要则可以关闭光栅化,所以我们做的第二个优化是注释掉下面这行代码:

光栅化会导致离屏渲染

===颜色格式 调试选项 Color Copied Images

  • 把图片从PNG或JPEG等格式中解压出来,得到像素数据
  • 如果GPU不支持这种颜色各式,CPU需要进行格式转换

比如应用中有一些从网络下载的图片,而GPU恰好不支持这个格式,这就需要CPU预先进行格式转化。第三个选项“Color Copied Images”就用来检测这种实时的格式转化,如果有则会将图片标记为蓝色。

===图片的大小 调试选项 Color Misaligned Images
在demo中,每个UIImageView
的大小都是180x180,而只有第二张图片的像素大小是360x360。因此除了第二张图片,其他的图片都需要被缩放。图片的缩放需要占用时间,因此我们要尽可能保证无论是本地图片还是从网络或取得图片的大小,都与其frame保持一致

第三个优化是调整所有图片的像素大小以避免不必要的缩放。

====离屏渲染 调试选项 Color Offscreen-Rendered Yellow
首先,OpenGL提交一个命令到Command Buffer,随后GPU开始渲染,渲染结果放到Render Buffer中,这是正常的渲染流程。但是有一些复杂的效果无法直接渲染出结果,它需要分步渲染最后再组合起来,比如添加一个蒙版(mask):

在前两个渲染通道中,GPU分别得到了纹理(texture,也就是那个相机图标)和layer(蓝色的蒙版)的渲染结果。但这两个渲染结果没有直接放入Render Buffer中,也就表示这是离屏渲染。直到第三个渲染通道,才把两者组合起来放入Render Buffer中。离屏渲染意味着把渲染结果临时保存,等用到时再取出,因此相对于普通渲染更占用资源。

引起离屏渲染===

  • 重写drawRect方法
  • 有mask或者是阴影(layer.masksToBounds, layer.shadow*),模糊效果也是一种mask
  • layer.shouldRasterize = true

常见问题设置圆角 cornerRadius 其中 layer.masksToBounds = true 会引起光栅化。。避免滑动时必须设置圆角的化 采用光栅化 缓存圆角。
同时对于圆角图片的裁剪 贝塞尔曲线 画出来。。UIBezierPath 设置裁剪路径。

你可能感兴趣的:(say your Highlights)