iOS 性能优化

2022-02-21  本文已影响0人  大菠萝_DABLO
图片

简介

这篇文章文章主要介绍iOS性能优化方面的信息,主要从四个方面进行:应用启动时间;页面刷新滚动流畅度;耗电量;安装包的大小

1.**** 应用启动时间

这里的应用启动时间指,应用启动到显示第一个页面展示时的时间。

应用启动有冷启动和热启动,热启动是指应用在后台活着,然后再启动应用。这里只谈冷启动。

启动时间在小于400ms是最佳的,因为从点击图标到显示Launch Screen,到Launch Screen消失这段时间是400ms。启动时间不可以大于20s,否则会被系统杀掉。

先来看看Xcode9新加的神器,通过添加环境变量可以打印出APP的启动时间分析(Edit scheme -> Run -> Arguments),DYLD_PRINT_STATISTICS设置为1,如果查看更详细的信息可以DYLD_PRINT_STATISTICS_DETAILS设置为1。

然后启动应用,即可查看到以下信息

Total pre-main time: 588.23 milliseconds (100.0%)

可以看到,在执行main函数前,应用准备了执行了4个流程:dylib loading、rebase/binding、ObjC setup、initializer,下面我们将好好分析这几个流程。

在了解了应用启动流程后,那对应用启动优化的工作就细分到了对每个流程的优化上。

1.1 main()函数之前:

1.1.1 dylibs:加载动态库

启动的第一步是加载动态库,加载系统的动态库是很快的,因为可以缓存,而加载内嵌的动态库速度较慢。

所以,提高这一步的效率的关键是:减少动态库的数量。合并动态库。

比如公司内部由私有Pod建立了如下动态库:XXTableView, XXHUD, XXLabel,强烈建议合并成一个XXUIKit来提高加载速度。

1.1.2 Rebase & Bind & Objective C Runtime

Rebase和Bind都是为了解决指针引用的问题。对于Objective C开发来说,主要的时间消耗在Class/Method的符号加载上,所以常见的优化方案是:

1)减少__DATA段中的指针数量。

2)合并Category和功能类似的类。比如:UIView+Frame,UIView+AutoLayout…合并为一个

删除无用的方法和类。

3)多用Swift Structs,因为Swfit Structs是静态分发的。

1.1.3 Initializers

通常,我们会在+load方法中进行method-swizzling,但这会影响应用启动的时间。

1)用initialize替代load。不少同学喜欢用method-swizzling来实现AOP去做日志统计等内容,强烈建议改为在initialize进行初始化。

2)减少atribute((constructor))的使用,而是在第一次访问的时候才用dispatch_once等方式初始化。

3)不要创建线程

4)使用Swfit重写代码。

1.2 main()函数之后:

优化的核心思想:能延迟初始化的尽量延迟初始化,不能延迟初始化的尽量放到后台初始化。

我们首先来分析下,从main函数开始执行,到你的第一个界面显示,这期间一般会做哪些事情。

在这个过程中我们可以借助工具来进行检测

CFTimeInterval startTime = CACurrentMediaTime();

当检测出耗时的模块时,就可以按照优化的核心思想来进行处理了。即:

能延迟初始化的尽量延迟初始化,不能延迟初始化的尽量放到后台初始化。

2. 页面刷新滚动流畅度

在优化流程度前需要先了解下iOS页面的成像过程。

2.1 CPU(Central Processing Unit,中央处理器):

对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)

2.2 GPU(Graphics Processing Unit,图形处理器):

纹理的渲染

2.3 成像过程:

CPU计算信息,GPU渲染信息到帧缓存区(iOS是双缓存机制,有前帧缓存、后帧缓存),视频控制器从帧缓存中读取信息显示到屏幕上。

2.4 造成卡顿的原因:

按照60FPS的刷帧率,每隔16ms就会有一次VSync信号,VSync信号来的时候就需要从帧缓存区中取缓存显示到屏幕上,如果每次VSync信号来的时候CPU和GPU没有处理好信息渲染到缓存区,那么就会从缓存中拿之前缓存的显示,就造成了丢帧,丢帧多了就会造成卡顿。

2.5 检测卡顿

平时所说的“卡顿”主要是因为在主线程执行了比较耗时的操作,这里检测的有两个方案:

2.6 解决卡顿

尽可能减少CPU、GPU资源消耗

2.6.1 优化

在OpenGL中,GPU有2种渲染方式:

3. 耗电量

3.1 应用耗电的主要来源有:

3.2 耗电优化:

4. 安装包瘦身

安装包(IPA)主要由可执行文件、资源组成,因此对于iOS安装包的瘦身也将从这两个方面进行

4.1 资源(图片、音频、视频等)

4.2 可执行文件瘦身

4.3 bitcode

xcode7之后多了这样的一个设置,默认是打开的。打开bitcode设置后,编译出来的包不是最终的二进制包而是bitcode中间码,Apple会根据编译器、应用设备来优化bitcode来给你最终最最优化的二进制应用包。这样避免了苹果更新了编译器或硬件设备时再提交app包到appstore的问题。同时也享受到了编译器改进带来的好处。

但是有个坑的地方,有些第三方库并不支持bitcode,如果要使用对应的第三方库就得关闭这个bitcode。由于时间太久,已经忘了当时是哪些第三方库不支持了,不知道现在有没有支持。

5. 其他:

青山不改,绿水长流,感谢大家支持,希望这篇文章能帮助到你!!

上一篇下一篇

猜你喜欢

热点阅读