iOS 性能优化知识梳理

1、概述

  • 在性能优化中,最具参考的属性是FPS(Frames Per Second),其实就是屏幕刷新频率。苹果推荐iPhone的刷新频率是每秒60次,即每秒钟刷新屏幕60次。该属性在静态页面值为0,不具有参考价值,在动画或者滑动的时候,FPS才具有参考价值,FPS的值大小反应页面的流畅程度,当低于45时页面表现得比较卡顿。

2、图层混合和检测

  • 图层混合
    每一个layer是一个纹理,所有的纹理都以某种方式堆叠在其顶部。一个屏幕像素点,GPU需要算出怎么混合这些纹理来获得像素RGB值。
    计算公式:R = S + D * (1 - Sa),结果颜色是源色彩(顶端纹理)+目标色彩(低一层纹理)*(1-源色彩的透明度)
    当Sa=0.5时,即源色彩不是不完全透明时,GPU需要进行计算,这种复合操作越多,GPU越忙碌,性能越差。
    当Sa=1时,源色彩完全不透明,直接拷贝这层色彩,不需要做操作(因为都被它遮挡了),GPU节省了相当大的工作量

  • 避免图层混合
    1、确保控件opaque属性为true,确保backgroundColor不透明
    2、如无特殊需要不要设置低于1的alpha值
    3、确保UIImage没有alpha通道

  • UILabel图层混合解决方法
    iOS8以前,直接设置背景色为不透明即可
    iOS8及之后,设置背景色为不透明并设置label.layer.masksToBounds=Yes(图层从CALayer变成UILabelLayer,周围多了一层透明的图层,使用masksToBounds裁剪调)

  • 图层混合的检测
    a、真机:XCode->Debug->View Debugging->Rendering->Color Blended Layers
    b、模拟器:XCode->Debug->Color Blended Layers

3、性能优化:初级

  • 1、使用ARC管理内存
  • 2、正确使用reuseIdentifier
  • 3、尽量设置views为透明
  • 4、避免过于庞大的xib
  • 5、不阻塞主线程
  • 6、尽量保持UIImageView和图片大小一致,网络图片可在其完成下载时在background线程调整图片大小然后再在主线程显示。
  • 7、选择正确的collection
    Array:使用index找值很快,使用值查找元素很慢
    Dictionary:键值对,使用键找值很快
    Set:无序的一组值。使用值查找很快,插入/删除很快

4、性能优化:中级

  • 1、重用和延迟加载Views(lazy load)
    a、更多的view渲染,意味着需要更多的cpu和内存消耗,对于那些嵌套很多view在ScrollView的app更是如此
    b、可模范UITableView和UICollectionView重用view:不一次创建所有的subview,而是在需要的时候再创建,当它们完成使命后,将他们放置到重用队列中,这样只需要在滚动的时候创建view,避免不划算的开销
  • 2、缓存(cache)
    a、缓存不经常改变但经常使用的数据
    b、比如:服务器的响应(GET)、图片、计算结果和UITableView的行高等
    c、NSCache和NSDictionary和类似,不同的是在系统回收内存的时候会删除NSCache的内容
  • 3、权衡渲染方法,ImageView和图片保持大小
  • 4、处理内存警告,删除内存缓存,比如图片、一些可以重新创建的objects的强引用等
  • 5、重用大开销对象
  • 6、适当使用属性持有初始化很慢的对象,比如NSDateFormatter和NSCalendar
  • 7、避免反复处理数据,前后两端使用相同的数据结构
  • 8、选择正确的数据格式,json解析比xml好,且便于传输
  • 9、正确设置背景图片,大背景图使用UIImageView,比较小的使用colorWithPatternImage设置背景图
  • 10、减少使用web特性。
  • 11、使用shadowPath设置阴影。使用CoreAnimation画阴影,系统不得不先得出你的图形后再加上阴影,这样开销很大。使用shadow Path不一样,因为它是你预先计算好的,不用每次计算如何渲染。但是会有这样的问题,view的frame经常更新,会不断的计算来更新shadow path
  • 12、选择正确的数据存储方式
    a、数据库sqlite:性能层面和core data相似,操作方式不一样
    b、core data:代表对象的graph model,sqlite就是一个dbms
    c、NSUserDefaults:plist文件,存储小数据
    d、xml:读取整个文件到内存解析,性能相对不好。sax的话,操作复杂
    e:NSCoding:读取文件,与xml的问题有点相似

5、性能优化:高级

  • 1、加速启动时间,异步处理相对复杂的任务,避免加载比较庞大的Xib
  • 2、创建很多临时变量的时候,使用autoreleasePool
  • 3、选择是否缓存图片,imageNamed加载方式会缓存图片到内存中,imageWithContentsOfFile加载方式不缓存图片到内存中
  • 4、避免日期格式转换,任何时候重用NSDateFormatter都是好的实践;使用时间戳转换比较好
  • 5、对代码的优化:使用性能分析工具,包括静态Analyze工具和运行时Profile工具,使用time profiler监测启动时间和方法消耗时间,然后对其进行优化

6、UITableView优化

  • 1、正确使用reuseIdentifier来重用cells
  • 2、尽量使所有的views opaque,包括cell本身
  • 3、避免渐变,图片缩放
  • 4、缓存行高
  • 5、如果cell的内容来自网络,使用异步加载,缓存结果
  • 6、使用shadowPath画阴影
  • 7、减少subviews的数量
  • 8、尽量不使用cellForRowAtIndexPath,如果需要使用,只使用一次然后缓存
  • 9、使用正确的数据结构存储数据
  • 10、使用rowHeight、sectionFooterHeight和sectionHeaderHeight来设定高度,不请求delegate

7、光栅化解析

  • 光栅化是将几何数据经过一系列变换后最终转变成像素,从而在设备上显示的过程,光栅化的本质是坐标变换、几何离散化

8、检测内存泄漏方式

  • 1、instrument->leaks
  • 2、instrument->allocations
  • 3、pruduct中的静态analyze
  • 4、MLeaksFinder腾讯团队出品
  • 5、Debug Memory Graph

9、高性能画圆角

  • 1、对于UIImageView,直接截取图片/或者像2一样使用core graphics画圆角
  • 2、对于其他view,使用core graphics画圆角
- (UIImage *)drawImageWithImage:(UIImage *)image opaque:(BOOL)opaque cornerRadius:(CGFloat)cornerRadius{UIGraphicsBeginImageContextWithOptions(image.size, opaque, [[UIScreen mainScreen] scale]);CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];[path addClip];[image drawInRect:rect];UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return resultImage;
}

10、优化App电量和降低IPA包大小

优化App电量

  • 1、CPU处理
    a、少用定时器
    b、不频繁写入数据,积攒到一定程度后再写入
    c、数据比较大时,使用数据库
    d、读写大量的数据使用dispath_io

  • 2、网络
    a、如果请求的网络数据相同,使用NSCache缓存
    b、使用断点续传,避免网络失败后重新下载
    c、网络不可用的时候,不尝试进行网络请求
    d、长时间的网络请求,提供可以取消的操作
    e、采用批量传输。下载视频流的时候,尽量一大块一大块的进行下载,广告可以一次下载多个。

  • 3、定位
    a、如果只是需要快速确定用户位置,最好使用CLLocationManaer的requestLocation方法,定位完成后,会自动让定位系统断电
    b、如果不是导航应用,尽量不要实时更新位置,定位完毕后就关闭定位服务
    c、降低定位精度,尽量不使用精度最高的kCLLocationAccuracyBest
    d、需要后台定位时,尽量设置pauseLocationUpdatesAutomatically为Yes,用户不太可能移动的时候会关闭定位服务
    e、尽量不要使用 startMonitoringSignificantLocationChanges,优先考虑startMonitoringForRegion:

  • 4、图像

降低IPA包大小

  • 1、可执行文件
    a、编译优化:Strip Linked Product设置为YES,会移除Strip Style中的符号;Make Strings Read-Only设置为YESSymbols Hidden by Default和Strip Debug Symbols During copy设置为YES
    b、去掉异常支持,比如C++异常支持(Enable C++ Exceptions设置为YES)、OC异常支持(Enable Objective-C Exceptions设置为YES)和Other C Flags添加-fno-exceptions
  • 2、资源文件
    a、去除没有用的资源
    b、对资源(图片、音频、视频等)进行无损的压缩

11、离屏渲染

  • 1、离屏渲染:在当前屏幕缓冲区外,开辟新的缓冲区进行操作

  • 2、触发场景
    a、圆角(与masksToBounds并用)
    b、图层蒙版
    c、阴影
    d、光栅化

  • 3、性能影响
    创建新的缓冲区,会触发OpenGL的多道渲染管线,图形上下文的切换会额外添加开销,增加GPU的工作;如果CPU和GPU的累积耗时超过16.67毫秒还没完成工作,会导致页面出现卡顿的情况

  • 4、离屏渲染检测
    真机:XCode->View Debugging->Rendering->Color Offscreen-Rendered Yellow,屏幕上显示黄色部分即为离屏渲染部分
    模拟器:XCode->Debug->Color Offscreen-Rendered Yellow


  • 转载请标明出处
  • 如有错误理解,还请各路大神批评指出

iOS 性能优化知识梳理相关推荐

  1. iOS 性能优化总结

    原文链接:https://github.com/skyming/iOS-Performance-Optimization 关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化 ...

  2. iOS性能优化之耗电量

    iOS性能优化之耗电量 前言 最近在测试App的时候,发现手机特别容易发烫,我们都知道 ,如果手机容易发烫,那么耗电量肯定会相当大,手机电量使用的时间也会相对少:对此,我在工作之余抽了点时间,对手机的 ...

  3. iOS性能优化系列篇之“列表流畅度优化”工具篇

    这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关于列表流畅度的优化.在具体内容的阐述过程中会结合性能优化的总体原则进行分析,所以建议大家在阅读这篇文章前先阅读一下上一篇文章:iOS性能优化系 ...

  4. iOS进阶开发-iOS性能优化-关东升-专题视频课程

    iOS进阶开发-iOS性能优化-3316人已学习 课程介绍         介绍了性能优化方法,其中包括内存优化.资源文件优化.延迟加载.持久化优化.使用可重用对象和并发访问等.这些内容都是非常重要的 ...

  5. iOS性能优化 - 启动优化

    APP的启动可以分为2种 冷启动(Cold Launch):从零开始启动APP: 热启动(Warm Launch):APP已经在内存中,在后台存活着,再次点击图标启动APP. APP启动时间的优化,主 ...

  6. iOS性能优化 - 耗电优化

    耗电来源: CPU处理: 网络: 定位: 图像. 如何优化: 1. 尽可能降低CPU.GPU功耗; 2. 少用定时器: 3. 优化I/O操作: 尽量不要频繁写入小数据,最好批量一次性写入: 读写大量重 ...

  7. iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  8. ios 性能优化(一)

    逻辑优化 代码封装优化 代码执行效率优化 界面优化 离屏渲染优化 界面加载优化 逻辑优化 代码封装优化 代码的封装优化主要是细化代码的功能,每个功能单独提取出来做成一个方法,当其他地方需要用到同样功能 ...

  9. 转iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  10. 前端性能优化-知识体系

    前端性能优化这件事情上, 我认为他是20%的理论, 加上至少80%的实践, 甚至很多理论本身也都是我们具体的业务场景中实践出来的.前端技术日新月异, 性能方案永远都在更迭, 所以一定要形成自己的学习思 ...

最新文章

  1. Nature综述:植物与微生物组的相互作用:从群落装配到植物健康(下)
  2. LaunchScreen.xib 设置启动图
  3. Unity3D研究院之Inspector面板枚举的别名与排序
  4. Linux System Account SSH Weak Password Detection Automatic By System API
  5. qopenglwidget 透明_廊坊透明真空袋用途-祺泰包装
  6. ASP.NET MVC中使用Autofac实现简单依赖注入
  7. 爬虫-csdn博客爬虫-打造具有搜索功能的小工具
  8. 桌面壁纸的deepin或者uos水印如何去除
  9. 8.8LSTM作为元学习器学习梯度下降
  10. 真正优秀的人是如何度过假期的
  11. java 遍历 List 的六种方式 学习笔记
  12. 使用ConfigurationManager来写自己的配置文件
  13. ORACLE 商业收费标准
  14. 34 WebGL物体的点光源的效果(逐顶点处理光源光照效果)
  15. 如何0代码快速搭建教育平台,实现线上直播教学【内附源码/Demo】
  16. SVA序列表达式操作符(intersect、within、throughout、first_match、matched)
  17. linux udp 端口测试,RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明
  18. C++ 多种取整函数的使用和区别: ceil() floor() round() trunc() rint() nearbyint()
  19. 分享一下前几个月我做的超炫的登录页面
  20. 入手python难不难_Python难不难?容易学吗?

热门文章

  1. python pySerial模块介绍
  2. 线性系统理论(不断更新中)
  3. 星星之火-57:前传接口 CPRI的速率、能力、小区带宽之间的映射关系
  4. 二叉查找树与平衡二叉树
  5. 根据银行卡号查询银行名接口
  6. MakeApie 将于 2月15号开始暂停服务
  7. 残差网络—ResNet
  8. MyBatis 缓存原理梳理
  9. python蓝屏代码_死机、卡顿、蓝屏,Python部分的老江湖告诉我的一些超等反常代码...
  10. canvas--初识canvs、绘制:线型、简单图形、渐变背景颜色、绘制动画、canvs形变、事件绑定