项目中优化细节

一.内存优化

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 5,306评论 1 27
  • 别人的总结不一定适合自己,所以尽量多做一些自己的总结,针对自己的薄弱点重点说明,适当的借鉴别人,少走一些弯路。最重...
    renkuo阅读 12,150评论 2 48
  • 对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方...
    城市里永远的学习者阅读 4,442评论 0 49
  • 前端开发面试知识点大纲: HTML&CSS: 对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:...
    秀才JaneBook阅读 7,512评论 0 25
  • $HTML, HTTP,web综合问题 1、前端需要注意哪些SEO 3、HTTP的几种请求方法用途 4、从浏览器地...
    peng凯阅读 4,114评论 0 1

友情链接更多精彩内容