所有应用程序在执行网络操作、更新用户界面或在CPU上运行代码时都会消耗能量。随着用户越来越多地依赖电池电量,以及应用程序的激增,能效已成为用户体验中不可或缺的一部分。
1.电池寿命
随着能源效率的下降,电池的寿命也会下降。同时消耗过多的资源会导致界面滞后,对用户输入的响应会很慢。随着越来越多的应用程序使用越来越多的资源,系统工作起来越来越努力,速度也越来越快,设备的物理温度也在逐渐升高。当这种情况发生时,系统会采取措施将温度降低到更容易接受的水平。
2.能量消耗的因素
CPU: CPU是能源的主要消耗者。高CPU使用周期会迅速耗尽用户的电池。 CPU使用率超过20%就会快速耗干电池电量——建议只在必要时通过批处理、调度和优先级排序来完成工作。
Network:大多数iOS应用程序执行网络操作。当联网发生时,蜂窝无线电和Wi-Fi等组件就会启动并消耗能量。通过批量处理和减少事务、压缩数据和适当处理错误,您的应用程序可以为节能做出重大贡献。
GPU: 图形处理器(显卡的处理器),乱使用GPU会导致交互差,并且降低电池寿命。
Location: 许多应用程序发出位置请求是为了记录用户的物理活动或提供基于环境的警报。能量消耗随着精确度的提高和位置请求的延长而增加。你的应用应该尽可能减少定位活动的准确性和持续时间。当不再需要时停止位置请求。
Background: 后台状态App仍会消耗电量,App要按需执行后台操作,并使用延迟APIs来保证系统运算高效执行.另外,在app进入后台状态是,立即减少动作,并且通知系统一次这些动作已经完成.
Bluetooth: 长时间的蓝牙活动会耗尽iOS设备和蓝牙设备的电池。只要可能,批处理和缓冲蓝牙活动,并减少对数据的轮询。
Device wakes:iOS设备依靠睡眠来延长电池寿命。无论设备何时唤醒,都会有很高的开销成本,因为必须为屏幕和其他资源提供电源。你的应用程序,尤其是在后台操作时,应该尽可能空闲,除非绝对必要,避免用推送通知或其他活动唤醒设备
3.分析工具
Activity Monitor: 活动监视器分析模板。使用此模板可以监视整体CPU,磁盘I / O和网络使用情况。
Core Animation:核心动画分析模板。使用此模板可以测量图形性能和CPU使用率。启用模板 Core Animation 的Flash Updated Regions 设置,以查看应用中发生的每个屏幕更新,并观察不必要或意外的更新。
Time Profile:时间分析器分析模板。使用此模板对正在运行的进程执行低开销的基于时间的采样。Time Profiler 监视应用程序中正在运行的线程,并定期采样。为每个样本收集完整的回溯,允许您深入查看样本,以准确找到代码中花费大量时间的位置。
4. Instrument的Time Profile调试和演示
(1)检查第一步,是通过xcode开发工具的energy impact来整体查看app的耗电情况。
energy impact
Overhead:表示开销,包括CPU的唤起,无线电模组(蓝牙&WiFi),和其他系统资源的调用等。
(2)检查第二步:通过instrument工具的energy log来检测具体的耗电模块。
Energy log工具
(3)配合time profile来跟踪代码具体位置。
连接手机设备;
搜索time profile并双击添加;
打开开关,操作app的某一个被检测功能;
而后断开开关,该工具就能自动加载刚被检测设备的数据;
设置过滤参数,开始分析数据。
下面 便是得到的数据分析界面:
CPU Usage 表示CPU消耗占比
Time profile
检测数据
设置参数
(4)检查占比权重高的位置双击可查看具体的代码。
占比权重
(5)经过检查,发现是一个加载gif的动画反复调用增加了能耗。可以通过代码优化来解决这个问题。
4.降低能量消耗举例
(1)CPU
Timer的时间间隔不宜太短,满足需求即可
线程适量,不宜过多,不要阻塞主线程
优化算法,减少循环次数
适当使用多线程
避免庞大的xib,storyBoard,尽量使用纯代码开发
(2) 网络请求
识别:确保不重复做同一个操作;
优化:使用后台会话
合并:批处理事务
减少:最小化重试,缓存结构优化等等
(3) GPU
减少视图刷新:确保必要的时候才刷新,能刷新1行cell最好只刷新一行;
审查模糊用法:避免将模糊放在更新元素上,尽量少使用圆角和透明度;
尽量减少使用离散GPU除非动画效果需要,或功能不能支持的情况下
(4) Location, Bluetooth, Background
定位和蓝牙按需取用,定位之后要关闭或降低定位频率,进入后台关闭定位,停止定时器运行等