一.内存优化
1.减少内存泄露。如Timer,Delegate,Block,CoreFoundation对象(C对象),Image
2.降低内存使用峰值。如使用懒加载
二.性能优化
卡顿产生的原因:
CPU计算时间以及GPU渲染时间较长,造成Vsync(垂直同步的信号)刷新衔接不上
解决卡顿主要思路:
尽可能减少CPU、GPU的资源消耗
优化方法(CPU方面):
1.尽量使用轻量级的对象,如果用不到事件处理的地方,我们就使用CALayer来取代UIView
2.不要频繁的调整和调用UIView相关属性,frame、bounds、transform等
3.尽量提前计算好布局
4.autolayout的布局比frame消耗更多CPU资源
5.图片的size和UIImageView的size最好一致,因为CPU会去计算和伸缩这个图片
6.控制线程的并发数量,把耗时的操作放到子线程,比如:
①文本计算,计算宽度和高度
②在图片显示之前进行解码和绘制(默认是在主线程)
优化方法(GPU方面):
1.尽量减少视图数量和层次,渲染次数就减少
2.尽量避免短时间内大量图片的显示,可以根据需求将多张图片 合成一张显示
3.减少透明的视图
4.减少离屏渲染,例如:
遮罩layer.mask
圆角layer.CornerRadius
阴影layer.shadow
这三个操作会触发离屏渲染
instrument如何检测卡顿?
使用CoreAnimation来查看程序显卡性能以及CPU使用情况
使用TimeProfiler查看系统耗时
三.耗电量优化耗电主要来源:
1.CPU处理(大量事件处理)
2.联网状态(大量的网络交互)
3.定位(持续使用定位)
4.图像(图片处理、渲染)
优化方法:
1.尽可能降低 CPU和GUP的消耗
①少用定时器
②减少文件读写(蓝牙传输文件),如果数据量比较大就使用SQLlite、CoreData
2.减少和压缩网络数据
①图片压缩、XML文件压缩
②如果多次请求的返回数据相同的,就使用缓存
③尽量使用断点续传,减少请求数据的交互
④网络情况不好或者不可用时,不要执行网络请求
3.定位优化
①如果是定位用户位置,使用CoreLocationManager的requestLocation方法,定位完成后就停止定位设备的供电
②如果不是导航应用尽量不要实时更新位置,定位完毕就关掉定位服务
③如果不是必须,就降低定位精准度
四.安装包瘦身
1.资源压缩(图片、视频、音频等)采用无损压缩,采用工具进行
2.去除无用资源,网上有开源的检测插件
3.可执行文件瘦身,检测未使用的代码,网上有开源的检测插件
4.使用插件检查linkmaps,可以检测出具体的文件大小,这样可以针对文件的大小进行文件内容优化
五、启动时间优化启动过程
1、加载dyld到App进程
2、加载动态库(包括所依赖的所有动态库)
3、Rebase
4、Bind
5、初始化ObjectiveC Runtime
6、其它的初始化代码
启动时间是用户点击App图标,到第一个界面展示的时间。以main函数作为分水岭,启动时间其实包括了两部分:main函数之前和main函数到第一个界面的viewDidAppear:。所以,优化也是从两个方面进行的,个人建议优先优化后者,因为绝大多数App的瓶颈在自己的代码里。
Main函数之后
1、能延迟执行的就延迟执行。比如SDK的初始化,界面(UIViewController)的创建。
2、不能延迟执行的,尽量放到后台执行。比如数据读取,原始JSON数据转对象,日志发送。
Main函数之前
1、合并动态库,比如公司内部由私有Pod建立了如下动态库:XXTableView, XXHUD, XXLabel,强烈建议合并成一个XXUIKit来提高加载速度。
2、合并Category和功能类似的类。比如:UIView+Frame,UIView+AutoLayout…合并为一个
3、删除无用的方法和类。
4、+load() 方法里的内容可以放到首屏渲染完成后再执行,或使用 +initialize() 方法替换掉。因为,在一个 +load() 方法里,进行运行时方法替换操作会带来 4 毫秒的消耗。不要小看这 4 毫秒,积少成多,执行 +load() 方法对启动速度的影响会越来越大。
5、控制 C++ 全局变量的数量。
六、项目中解决的难点(直播弹幕方面)线程安全、UI轻量化、弹幕集中化(某时间段大量弹幕)。