查漏补缺

iOS性能优化

2021-06-01  本文已影响0人  iOS开发面试总结

(一)卡顿优化

【了解CPU和GPU】

在屏幕成像过程中,CPU和GPU的作用是至关重要的。

image

iOS中采用的是双缓冲机制,分为前帧缓存和后帧缓存。

【屏幕成像原理】 屏幕成像原理是一个非常庞大的知识体系,这里仅介绍一下我们当前所需要了解的部分,以便我们接下来的话题。 屏幕的显示,是受控于两种信号

屏幕发出VSync之后,就表示将要进行新一帧画面的显示,于是开始从帧缓存里面读取经过GPU渲染好的用于显示的数据

显示器从帧缓存里拿到数据之后,是从上到下一行一行的刷新的,刷新完一行,就发出一个HSync,直到最下面一层显示出来,这样,一帧的画面就完成了显示。

image

我们可以把屏幕想象成刷墙师傅,每一帧的数据就是桶里的油漆,而GPU就是负责提供油漆的店老板。

题库资料已上传到Github:https://github.com/Henry-ley/rest/blob/main/README.md内附整理的学习思维导图以及一些iOS资料。

【卡顿产生的原因】

我们手机屏幕的刷帧率是60FPS(Frame per Second 帧/秒),也就是会所1秒钟的时间,屏幕可以刷新60帧(次)。完成一帧刷新的用时是16.6毫秒。因此垂直同步信号VSync就是每16.6毫秒发出一次。

两次VSync之间的这16.6毫秒,就是被CPU和GPU共同完成下一帧画面的计算和渲染工作的时间。但是CPU计算和GPU渲染所用的时间是取决于任务的运算量的,因此就有可能大于16.6毫秒,也有可能小于或者等于16.6毫秒。

这里我们假设Tc=CPU计算时间,Tg=GPU渲染时间。如果Tc+Tg <= 16.6ms,那么完美,下一帧画面的数据可以在VSync到来之间就准备好;但是如果Tc+Tg > 16.6ms,意味着屏幕将要开始显示下一帧画面了,但是CPU和GPU那里却还在咔咔咔的准备着画面数据,那么没办法,在接下来的16.6ms周期里面,屏幕就继续用上一帧的画面数据来显示。同一个画面被显示了过长的时间,就造成了视觉上可感知到的卡顿现象。再通过下图来体会一下

画面卡顿的产生
【卡顿优化-CPU】

上看我们了解了产生的原因,就是由于CPU计算时间和GPU的渲染时间过长导致的。因此想要优化卡顿问题,无非就是从CPU和GPU下手,减轻它们的工作量,以控制它们的操作耗时。

首先开看看CPU,我们有如下途径来减轻它的计算任务

尽量用轻量级的对象,比如简单的数字,尽量选择基础数据类型,不要使用NSNumber,对象操作的开销肯定大于基础数据类型的开销。

CALayer是用来显示图像的,UIView是负责处理触摸交互事件的,UIView内部封装了CALayer属性,因此UIView的图像显示实际上是它内部的这个CALayer来完成的。因此如果我们不需要考虑触摸事件,只是单纯的要显示内容的话,可以考虑用CALayer取代UIView

尽量提前计算好布局,在有需要的时候一次性调整对应属性,不要多次修改

图片的size最好是跟UIImageViewsize刚好一致,可以省去图片剪裁的操作开销

控制一下线程的最大并发数

尽量把耗时操作放到子线程处理(比如文本的尺寸计算、绘制,图片的解码、绘制)

【卡顿优化-GPU】

对与GPU,有下列方案可以减少渲染开销

【离屏渲染】

在OpenGL中,GPU有两种渲染方式

为什么离屏渲染消耗性能?

哪些操作会触发离屏渲染?

🥝可以考虑通过CoreGraphics绘制剪裁圆角,或者叫美工提供圆角图片🥝

🥝如果设置了layer.shadowPath就不会产生离屏渲染🥝

【卡顿检测】

平时我们所碰到的卡顿,主要是在主线程执行了比较耗时的操作,可以在主线程RunLoop中添加observer,通过监听RunLoop的状态切换耗时,来监控卡顿。

(二)耗电优化

iOS 设备耗电的主要来源有一下几种 iOS设备耗电来源

耗电优化方案

用户移动、摇晃、倾斜设备时,会产生动作事件(motion),这些事件是由加速度计、陀螺仪、磁力传感器等硬件检测的。在不需要检测的场合,应该及时关闭这些硬件。

(三)启动优化

【App启动过程分析】

App的启动可以分为两种

App的启动时间优化,主要是针对冷启动来进行优化的。那么首先我们就需要了解一下App的冷启动过程包含哪些步骤。

到此为止,可执行文件和动态库中的所有所有Symbols(符号,包括 Class, Protocol, Selector, IMP等等)都已经按照规定格式加载到内存中,并且被runtime所管理

小结

image
【App启动优化】

dyld阶段优化

Runtime阶段优化

main阶段优化

在不影响用户体验的前提下,尽可能讲一些操作延迟,不要全都放在didFinishLaunchingWithOptions 方法中。 ###(四)安装包瘦身 iOS的安装包(ipa)主要有可执行文件和资源组成 可执行文件——就是由我们iOS项目的代码经过编译连接产生的二进制文件,要想对可执行文件进行瘦身,有如下几种思路:

Strip Linked ProductMake Strings Read-OnlySymbols Hidden by Default设置为YES 去掉异常支持,Enable C++ ExceptionsEnable Objective-C Exceptions设置为NOOther C Flags添加-fno-exceptions

资源——包括我们iOS项目中的图片、音频、视频、storyboard等,对其进行优化的思路有

题库资料已上传到Github:https://github.com/Henry-ley/rest/blob/main/README.md内附整理的学习思维导图以及一些iOS资料。

作者:RUNNING_NIUER
链接:https://juejin.cn/post/6966859086008680455

上一篇 下一篇

猜你喜欢

热点阅读