面试题引发的思考:
Q: 项目优化从哪几方面着手?
- 耗电优化、启动优化、卡顿优化、APP瘦身。
Q: 耗电优化的几个方面?
-
CPU优化:
降低CPU、GPU功耗、少用定时器、优化I/O操作; -
网络优化:
压缩网络数据、缓存、断点续传、无网超时操作、批量传输; -
定位优化:
定位类型选择、实时更新设置、定位精度选择; -
图像优化:
控制视图层数、图片数量、图片大小,减少透明视图,避免离屏渲染; -
硬件检测优化:
不需要时,及时关闭加速度计、陀螺仪、磁力计等。
1. 耗电主要来源
耗电的主要来源如下:
- CPU处理(Processing)
- 网络(Networking)
- 定位(Location)
- 图像(Graphics)
- 硬件(Hardware)
2. 耗电优化
(1) CPU优化
- 尽可能降低CPU、GPU功耗;
- 少用定时器;
-
优化I/O(Input/Output)操作:
- 尽量不要频繁写入小数据,最好 批量一次性写入;
- 读写大量重要数据时,考虑用
dispatch_io
,其提供了基于GCD的异步操作文件I/O的API;dispatch_io
系统会优化磁盘访问; - 数据量比较大的,使用 数据库(比如SQLite、CoreData)。
(2) 网络优化
- 减少、压缩网络数据(XML体积比较大,json体积比较小,google的protocol buffer) (上传压缩文件,服务器收到文件后再解压);
- 如果多次请求的结果是相同的,尽量使用 缓存;
- 使用 断点续传,否则网络不稳定时可能多次传输相同的内容;
- 网络不可用时,不要尝试执行网络请求;
- 让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的 超时时间;
- 批量传输,比如:下载视频流时,不要传输很小的数据包,直接下载整个文件或者一大块一大块地下载。
(3) 定位优化
- 如果只是需要快速确定用户位置,最好用
CLLocationManager
的requestLocation
方法。定位完成后,会自动让 定位硬件断电; - 如果不是导航应用,尽量 不要实时更新位置,定位完毕就关掉定位服务;
-
尽量降低定位精度,比如尽量不要使用精度最高的
kCLLocationAccuracyBest
; - 需要后台定位时,尽量设置
pausesLocationUpdatesAutomatically = YES
,如果用户不太可能移动的时候系统会自动暂停位置更新; - 尽量不要使用
startMonitoringSignificantLocationChanges
,优先考虑startMonitoringForRegion:
。
(4) 图像优化
- 视图层数控制:尽量减少视图数量和层次;
- 控制图片大小:GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理;
- 减少图片数量:尽量避免段时间内大量图片的显示,尽可能将多张图片合成一张图片显示;
-
减少透明的视图:少用透明图(
alpha<1
),不透明的就设置opaque
为YES
; - 尽量避免出现离屏渲染:光栅化、切角、阴影、遮罩。
(5) 硬件检测优化
- 用户移动、摇晃、倾斜设备时,会产生 动作(motion)事件,这些事件由 加速度计、陀螺仪、磁力计 等硬件检测。
- 在不需要检测的场合,应该及时关闭这些硬件。