性能优化
选择正确的collection
- array使用index查找很快,使用值查找元素很慢
- dictionary使用键找值很快
- set:无序的一组值。使用值查找很快,插入/删除很快
尽量保持UIImageView和图片大小一致
重用和延迟加载
缓存
- 缓存不经常改变但经常使用的数据(图片,计算结果,cell行高)
界面优化
避免图层混合
- 确保控件opaque属性为true
- 确保backgroundColor不透明
- 不要设置低于1的alpha值
- 确保UIImage没有alpha通道
UILabel图层混合解决方法
- 设置背景色为不透明并设置label.layer.masksToBounds=Yes(图层从CALayer变成UILabelLayer,周围多了一层透明的图层,使用masksToBounds裁剪调)
图层混合的检测
- 真机:XCode->Debug->View Debugging->Rendering->Color Blended Layers
- 模拟器:XCode->Debug->Color Blended Layers
UITableView优化
- 重用cell
- 缓存行高,如果固定,使用rowHeight
- 减少subviews数量,否则,使用drawrect添加
- 使用rowHeight、sectionFooterHeight和sectionHeaderHeight来设定高度,不请求delegate
- 如果cell的内容来自网络,使用异步加载,缓存结果
- 避免渐变,图片缩放
- 局部刷新,避免reloaddata
- 耗时操作,异步处理
- 滑动过程不进行图片加载,停止滑动再加载图片
- cell类型尽量少,可以善用hide
- 尽量使所有的 view 的 opaque 属性为 YES,包括 cell 自身,以提高视图渲染速度(避免无用的 alpha 通道合成,降低 GPU 负载)
- 使用 shadowPath 来画阴影
- 不要动态添加view到cell里面,应该初始化的时候添加,使用hide处理
- 避免触发离屏渲染,maskToBounds会触发,drawRect也会触发,应减少
- 由于图片设置圆角,正常情况下是需要maskToBounds的,这个时候会触发离屏渲染,所以得换:使用蒙版+贝塞尔曲线加圆角
CPU
- 对象的创建/销毁
- 尽量使用轻量级的对象,CALayer代替UIView,Int代替NSNumber
- 对象属性的调整
- 尽量减少调整UIView的属性,尽量减少不必要的修改,frame,bounds,transform
- 布局计算
- 尽量提前计算好布局,在需要的时候一次性调整好布局,不要多次修改属性
- 文本的计算和排版
- Autolayout比直接设置frame消耗更多的CPU资源
- 图片的格式转换和解码
- 图片的size尽量跟UIImageview的size大小一致
- 图像的绘制(Core Graphics)
- 控制线程的最大并发数
- 把耗时操作放在子线程处理
文本处理(尺寸计算/绘制)
图片处理(解码/绘制)
GPU
- 纹理的渲染
- 尽量避免短时间内大量图片的显示,尽可能将多张图片合并成一张显示
- GPU处理的最大纹理尺寸为4096*4096,超出部分就会占用CPU资源进行处理,所以纹理不要超过这个尺寸
- 尽量减少试图层次跟数量
- 减少透明试图,不透明的就设置opaque为YES
- 尽量避免出现离屏渲染
原因:
1 创建缓冲区
2 切换上下文
触发
1 光栅化 layer.shouleRasterize = YES
2 遮罩 layer.mask
3 圆角 同时设置layer.masksToBounds = YES和layer.cornerRadius>0
考虑使用CoreGraphics绘制裁剪圆角,或者直接提供圆角图片
4 阴影,layer.shadowXXX
如果设置了layer.shadowPath就不会产生离屏渲染
耗电优化
- 定时器
- I/O操作
- 避免频繁使用
- 大量数据使用dispatch_IO 异步操作
- 数据量大使用数据库
- 网络优化
- 减少/压缩网络数据
- 请求结果相同,缓存
- 断点续传
- 无网络,不要请求
- 可取消长时间请求,设置超时时间
- 批量传输,减少请求次数
- 定位优化
- 快速获取位置,使用requestLocation
- 如果不是导航应用,尽量不要实时更新位置,定位完毕就关闭服务
- 尽量降低精准度
- 需要后台定位时,设置可暂定位置更新
网友评论