一:针对CPU
1.文本的计算放到分线程,Coretext或Textkit进行相关绘制
2.图片解码放到子线程
3.圆角重新子线程绘制一张图片
4..避免 对象创建,对象销毁,对象调整,尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示
5.减少subviews的数量
6.避免重复计算,比如 缓存高度,只计算一次,根据数据源计算出对应的布局,并缓存到数据源中(ps:如果现在要显示100个Cell,当前屏幕显示5个。那么刷新(reload)UITableView时,UITableView会先调用100次
tableView:heightForRowAtIndexPath:
方法,然后调用5次
tableView:cellForRowAtIndexPath:
方法;滚动屏幕时,每当Cell滚入屏幕,都会调用一次
tableView:heightForRowAtIndexPath:
tableView:cellForRowAtIndexPath:
二:针对GPU
-
多视图混合情况
(1)背景不透明,尽量少用或不用透明图层:确保控件的opaque属性设置为true,确保backgroundColor和父视图颜色一致且不透明如无特殊需要,不要设置低于1的alpha值
(2)确保UIImage没有alpha通道
2.图片相关
(1)确保图片大小和frame一致,保证字节对齐,不要在滑动时缩放图片,缩放消耗时间
(2)图片格式png:确保图片颜色格式被GPU支持,避免劳烦CPU转换
3.字节对齐
Core Animation在图像数据非字节对齐的情况下渲染前会先拷贝一份图像数据,
32位对应rgb和alpha,字节对齐不进行额外计算 像素不对齐:会继续合成纹理,消耗资源
4.慎用离屏渲染
绝大多数时候离屏渲染会影响性能 ,尽量其它方法实现
设置圆角、阴影、模糊效果,光栅化都会导致离屏渲染
设置阴影效果是加上阴影路径
滑动时若需要圆角效果,开启光栅化
三:解码图像
一般我们使用的图像是JPG/PNG,这些图像数据不是位图,而是是经过编码压缩后的数据,使用它渲染到屏幕之前需要进行解码转成位图数据,这个解码操作是比较耗时的,并且没有GPU硬解码,只能通过CPU,iOS默认会在主线程对图像进行解码。很多库都解决了图像解码的问题,不过由于解码后的图像太大,一般不会缓存到磁盘,SDWebImage的做法是把解码操作从主线程移到子线程,让耗时的解码操作不占用主线程的时间。
四:内存映射
平常我们读取磁盘上的一个文件,上层API调用到最后会使用系统方法read()读取数据,内核把磁盘数据读入内核缓冲区,用户再从内核缓冲区读取数据复制到用户内存空间,这里有一次内存拷贝的时间消耗,并且读取后整个文件数据就已经存在于用户内存中,占用了进程的内存空间。