优化

iOS性能优化

2019-11-08  本文已影响0人  RUNNING_NIUER

(一)卡顿优化

【了解CPU和GPU】

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

【屏幕成像原理】

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

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

【卡顿产生的原因】

我们手机屏幕的刷帧率是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有两种渲染方式

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

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

【卡顿检测】

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

(二)耗电优化

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

耗电优化方案

(三)启动优化

【App启动过程分析】

App的启动可以分为两种

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

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

【App启动优化】

dyld阶段优化

Runtime阶段优化

main阶段优化
在不影响用户体验的前提下,尽可能讲一些操作延迟,不要全都放在didFinishLaunchingWithOptions方法中。

(四)安装包瘦身

iOS的安装包(ipa)主要有可执行文件和资源组成
可执行文件——就是由我们iOS项目的代码经过编译连接产生的二进制文件,要想对可执行文件进行瘦身,有如下几种思路:

上一篇 下一篇

猜你喜欢

热点阅读