启动时间优化
- 精简逻辑,将非必要操作延时到其他时间段。
- 将不必须在+load中做的事延迟到+ initialize中。
- 不使用xib,直接用代码加载首页视图。
- release版不要用NSLog输出。
- 启动时的网络请求尽可能异步。
- 尽量减少加载内嵌(embedded)的 dylib 文件。
减少CPU、GPU资源消耗方案
1. UITableView、UIConllectionView复用机制,以及cell内容实现方式,包括自适应高度的缓存
2. 设置View为不透明
UIView 又一个 opaque 属性, 在不需要透明效果的时候,应该尽量设置它为 YES, 可以提高绘图效率。
3. 不要阻塞主线程,合理使用子线程
主线程阻塞超过400毫秒就会让用户感知到卡顿,跟用户交互的操作如渲染,管理触摸反应,回应输入等都是在主线程的,所以不要让主线程承担过多耗时操作,耗时操作放到子线程中进行
。
合理进行线程分配
- UI 操作和 DataSource 操作在主线程
- DB 操作,日志记录,网络回调在各自固定线程
- 不同业务,通过使用队列保持数据一致性。
4. 使用尺寸匹配的UIImage
当从 App bundle 中加载图片到 UIImageView 时,最好确保图片的尺寸和 UIImageView 相对应。否则会使UIImageView 对图片进行拉伸,这样会影响性能。如果图片时从网络加载,需要手动进行 scale。在UIImageView 中使用resize 后的图片
5. 选择合适的容器,减小时间复杂度
在使用 NSArray / NSDictionary / NSSet 时,了解他们的特点,根据需要尽可能选择时间复杂度小的容器
。
6. 懒加载视图、预处理和延时加载
7. 缓存
开发需要秉承一个原则,对于一些更新频率低,访问频率高的内容进行缓存,例如:
- 服务器响应数据
- 图片
- 计算值 (UITableView 的 row height)
8. 复用高开销对象
NSDateFormatter , NSCalendar等高开销对象, 我们可以使用一个全局单例
强引用着这个对象,保证整个App 的生命周期只被初始化一次
9. 减少离屏渲染
离屏渲染:GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。
10. 合理选择 imageNamed 和 imageWithContentsOfFile
- imageNamed 会对图片进行缓存,适合多次使用某张图片
- imageWithContentsOfFile 从bundle中加载图片文件,不会进行缓存,适用于加载一张较大的并且只使用一次的图片,例如引导图等
11.优化计算的复杂度从而减少CPU的使用,选择性能高的API
比如遍历的三种方式:for循环、for-in、enumerate,根据特点选择适当的方式。
12.用轻量级对象代替重量级对象
在合适的时机使用 CALayer 替代 UIView等。
13.I/O 性能优化,慎重进行IO操作
化零为整、NSCache缓存、适合的线程。
14.定位、地图相关
15.封装一个全局定时器?暂时不知道是否合理
16.尽量避免使用Storyboard
通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大非常多,在性能敏感的界面里,Storyboard 并不是一个好的技术选择。
17.尽量避免调整视图层次、添加和移除视图,以及 frame/bounds/center的修改
提前计算好布局,在需要时一次性调整好对应属性,而不要多次、频繁的计算和调整这些布局相关属性。
18.纹理的渲染
尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。
参考文章:
- 今日头条iOS客户端启动速度优化
- 腾讯--iOS APP 性能检测
- 美团--移动端性能监控方案Hertz
- YYKit 作者-iOS 保持界面流畅的技巧 原文链接:blog.ibireme.com
- “sindri的小巢”的(iOS监控-卡顿检测)
- iOS-性能优化深入探究
链接文章:
iOS APP性能检测&优化(一)