项目中优化细节

一.内存优化

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轻量化、弹幕集中化(某时间段大量弹幕)。

你可能感兴趣的:(项目中优化细节)