所有应用程序在CPU上运行网络操作、更新用户界面或运行代码时都会消耗能源。随着用户越来越依赖电池电量,以及应用程序的激增,能源效率成为用户体验不可或缺的一部分。
一、良好的用户体验需要:
- 电池续航能力很好。随着能源效率的下降,电池续航能力也会下降。用户希望其iOS设备上的电池续航时间为全天。
- 速度惊人。iOS旨在在复杂的操作中提供出色的性能,并使您的应用程序飞起来。
- 反应灵敏。一次消耗过多的资源可能会导致界面滞后,对用户输入的反应缓慢。
- 酷炫的体验。随着越来越多的应用程序使用更多资源,系统工作越来越努力,设备的物理温度也逐渐上升。当这种情况发生时,系统会采取措施冷却到更可接受的水平。
二、耗电原因?
CPU 是耗电操作
引起 CPU 耗电的单点问题可以通过监控来解决,但点滴汇聚终成大海,每一个不合理的小的电量消耗,最终都可能会造成大的电量浪费。
对 CPU 的使用要精打细算,要避免让 CPU 做多余的事情。对于大量数据的复杂计算,应该把数据传到服务器去处理,如果必须要在 App 内处理复杂数据计算,可以通过 GCD 的 dispatch_block_create_with_qos_class 方法指定队列的 Qos 为 QOS_CLASS_UTILITY,将计算工作放到这个队列的 block 里。在 QOS_CLASS_UTILITY 这种 Qos 模式下,系统针对大量数据的计算,以及复杂数据处理专门做了电量优化。
I/O 耗电操作
任何的 I/O 操作,都会破坏掉低功耗状态 优化方案:
业内的普遍做法是,将碎片化的数据磁盘存储操作延后,先在内存中聚合,然后再进行磁盘存储。碎片化的数据进行聚合,在内存中进行存储的机制,可以使用系统自带的 NSCache 来完成。
NSCache 是线程安全的,NSCache 会在到达预设缓存空间值时清理缓存,这时会触发 cache:willEvictObject: 方法的回调,在这个回调里就可以对数据进行 I/O 操作,达到将聚合的数据 I/O 延后的目的。I/O 操作的次数减少了,对电量的消耗也就减少了。
示范场景:
SDWebImage 图片加载框架,在图片的读取缓存处理时没有直接使用 I/O,而是使用了 NSCache。
三、如何优化电量?
苹果公司专门维护了一个电量优化指南 “Energy Efficiency Guide for iOS Apps”,分别从 CPU、设备唤醒、网络、图形、动画、视频、定位、加速度计、陀螺仪、磁力计、蓝牙等多方面因素提出了电量优化方面的建议。
1.减少工作并优先排序
1.1 减少后台工作:
- 后台活动完成后没有通知系统
- 播放无声音频
- 执行位置更新
- 与蓝牙配件交互
- 可以推迟的下载
1.2 尽量减少计时器的使用
- 计时器的高成本
- 无需使用计时器即可获取事件通知
- 使用GCD工具进行同步,而不是计时器
- 如果您必须使用计时器,请高效使用它
1.3 尽量减少I/O
- 尽量减少数据写入
- 避免太频繁地访问内存
- 尽可能按顺序读取和写入数据
- 了解系统如何缓存文件数据
2.网络变量对能源的影响
- 蜂窝网络活动比Wi-Fi活动需要的能量要多得多
- 网络吞吐量,过多频繁的网络请求
- 降低媒体质量和大小,压缩数据
3.高效使用图形,动画,视频
- 减少应用程序使用的视图数量
- 减少不透明度的使用
- 尽可能对动画使用较低的帧速率
- 避免在屏幕上同时使用多个帧速率
4.尽量减少外围互动
- 仅在需要时扫描设备
- 尽可能减少收音机的使用
- 蓝牙设备消耗能源
- 本文作者: Grx
- 本文链接: https://ruixiaoguo.github.io/Grx.github.io/Grx.github.io/2021/12/20/iOS应用程序的能源效率指南/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!