iOS耗电优化

作者: lltree | 来源:发表于2019-01-05 18:01 被阅读1次

    使用xcode打开你的工程,然后插上手机,使用真机running项目(必须是真机),然后comand + 6,点击Energy Impact


    image.png

    其中颜色表示

    • 蓝色:表示合理
    • 黄色:表示程序比较耗电
    • 红色:表示仅仅轻度使用你的程序,就会很耗电.

    其中名词解释:

    • Utilization :表示瞬时耗电情况
    • Average :表示平均耗电情况
    • Energy Impact::表示耗电影响
    • cost(蓝色)表示运行项目代码需要电量
    • Overhead(红色)表示开销,包括CPU的唤起,无线电模组(蓝牙&WiFi),和其他系统资源的调用等

    影响电量的五个因素,灰色表示有电量消耗,白色表示没有电量消耗

    • Network : 网络活动会唤起需要长时间周期性供电的无线电模组,可以分批次进行网络请求,来降低开销.
    • Location :精密&高频的的定位会增加开销,需要按需使用.
    • CPU :CPU使用率超过20%就会快速耗干电池电量.高效使用CPU,并且当用户出现模糊输入时快速做出不做事情的反应.
    • GPU :图形处理器(显卡的处理器),乱使用GPU会导致交互差,并且降低电池寿命.
    • Background : 后台状态App仍会消耗电量,App要按需执行后台操作,并使用延迟APIs来保证系统运算高效执行.另外,在app进入后台状态是,立即减少动作,并且通知系统一次这些动作已经完成.

    耗电量优化

    1 网络方面优化

    • 请求前判断网络状态,网络不可用,不要尝试执行网络请求;

    • 请求前设置合适的超时时间,避免长时间运行或者速度很慢的网络操作,

    • 请求过程尽量使用断点续传,否则网络不稳定的时候可能多次传输相同的内容。(传输1M文件,如果一次性下载,一旦网络问题下载失败,下次重新请求,会从头开始。之前下载过的部分会进行重新下载,断点续传可以保证之前下载的数据缓存起来);

    • 减少、压缩网络数据。(不同格式数据提交关系:XML提交比较大;JSON 提交比较小,protobuf提交最小)

    • 请求结果使用缓存

    • 批量传输,避免多次WIFI多次上电吊电。比如下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。如果下载广告,一次性多下载一些,然后再慢慢展示。如果下载电子邮件,一次下载多封,不要一封一封地下载。

    2 定位优化

    • 如果不是导航的应用,尽量不要实时更新位置,定位完毕就关掉定位服务;
    • 如果只是需要快速确定用户的位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电;
    • 尽量降低定位精度,比如尽量不要使用精度最高的KCLLocationAccuracyBest;精度越高,硬件模块功耗越大;
    • 需要后台定位时,尽量设置pauseLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新。

    大致的意思就是如果这个属性设置成YES(默认的也是YES),那么系统会检测如果设备有一段时间没有移动,就会自动停掉位置更新服务。这里需要注意的是,一旦定位服务停止了,只有当用户再次开启App的时候定位服务才会重新启动。
    这里的一段时间是系统自动判定的,可以通过设置activityTypeproperty这个属性来决定这个时间的长短。
    API的意思是,类似导航类的App,系统检验的时间会稍长一点,想运动类的App,就会比导航类的短一点。但是具体时间还是由系统来决定。

    • 尽量不要使用startMonitoringSignificantLocationChanges,优先考虑startMonitoringForRegion:

    一.代码层面

    1.合理使用NSDateFormatter 和 NSCalendar这种高开销对象

    性能测试表明,NSDateFormatter的性能瓶颈是由于NSDate格式到NSString格式的转化,所以把NSDateFormatter创建单例意义不大.推荐的做法是,把最常用到的日期格式做缓存.

    static NSDateFormatter *cachedDateFormatter = nil;
    
    + (NSDateFormatter *)cachedDateFormatter {
    
    if (!dateFormatter) {
    
    dateFormatter = [[NSDateFormatter alloc] init];
    
    
    [dateFormatter setDateFormat: @“YYYY-MM-dd HH:mm:ss”];
    
    }
    
    return dateFormatter;
    
    }
    

    2.不要频繁的刷新页面,能刷新1行cell最好只刷新一行,尽量不要使用reloadData.

    3 选择正确的集合

    • NSArray,使用index来查找很快(插入和删除很慢)
    • NSDictionary字典,使用键来查找很快
    • NSSets,是无序的,用键查找很快,插入/删除很快

    4 少用运算获得圆角,不论view.maskToBounds还是layer.clipToBounds都会有很大的资源开销,必须要用圆角的话,不如把图片本身就做成圆角

    5 懒加载,不要一次性创建所有的subview,而是需要时才创建.

    6 重用

    7 图片处理

    • 图片与imageView相同大小,避免多余运算
    • 可以使用整副的图片,增加应用体积,但是节省CPU
    • 可调大小的图片,可以省去一些不必要的空间
      = CALayer,CoreGraphics,甚至OpenGL来绘制,消耗CPU

    8.cache,cache,cache(缓存所有需要的)

    • 网络请求增加缓存
    • 复杂计算结果的缓存(UITableView的行高)

    9.尽量少用透明或半透明,会产生额外的运算.

    10.使用ARC减少内存失误,dealloc需要重写并对属性置为nil

    11.避免庞大的xib,storyBoard,尽量使用纯代码开发

    CPU层面

    1.Timer的时间间隔不宜太短,满足需求即可

    2.线程适量,不宜过多,不要阻塞主线程

    3.优化算法,减少循环次数

    4.定位和蓝牙按需取用,定位之后要关闭或降低定位频率

    相关文章

      网友评论

        本文标题:iOS耗电优化

        本文链接:https://www.haomeiwen.com/subject/yteehqtx.html