iOS性能检测和优化
2020-01-05 本文已影响0人
gy先生
卡顿原因分析
- 用户在使用APP的过程中,客户端要在持续60fps左右的帧率情况下才能保证流畅度,低于40fps就有明显的卡顿情况;那么在什么情况下才会导致帧率下降呢?
- 我们都知道APP需要在主线程进行渲染操作,同时还有很多业务功能需要添加,当主线程中需要许多耗时任务的情况下就会阻塞主线程从而掉帧;要保证每一帧的渲染和业务功能在16.67ms内完成不会掉帧;那么如何进行优化呢?
- 回到系统层面,主线程耗时的操作主要是CPU和GPU耗时的总和;哪一边占用太多时间都会导致掉帧;如果某一时段CPU比较耗时,就尽量将耗时代码分离到不同的时间碎片减压,或者挪动到别的线程帮助减压;如果某一时段GPU使用比较耗时,意味着短时间内提交的纹理和顶点数据过多,应尽量优化大图资源,避免多图层资源混合,以及避免离屏渲染等情况;
- CPU或GPU消耗原因分析参照 https://www.jianshu.com/p/b29c682679c4
性能分析工具 TimeProfile
- Xcode自带的Instruments工具,有很多帮助分析工程项目的应用,为了直观的查看项目代码的运行耗时情况,可以使用TimeProfile帮助精准的定位问题;
- 具体使用教程参照 https://www.jianshu.com/p/cc2d64bf511d
耗时代码整理
- 尽量使用drawAtPoint,而不要使用drawInRect,涉及首页,我的页面中下拉刷新用的动图生成
- AdModule,TabBarModule,ShareModule初始化占用时间过长
- +[QRCodeTools zxingQRCodeWithString:]编码耗时过长
- xib初始化会额外占用时间,根据页面复杂度将占用7~11ms,建议使用别的布局替代方案
渲染耗时分析
- UI 渲染一旦出现繁重的任务就会导致界面卡顿,这类任务通常分为3类:排版,绘制,UI 对象操作, 像复杂排版的首页经常会出现这种问题。
- 排版通常包括计算视图大小、计算文本高度、重新计算子式图的排版等操作。
- 绘制一般有文本绘制 (例如 CoreText)、图片绘制 (例如预先解压)、元素绘制 (Quartz)等操作。
- UI 对象操作通常包括 UIView/CALayer 等 UI 对象的创建、设置属性和销毁
AsyncDisplayKit
- AsyncDisplayKit主要就是解决的问题就是操作页面过程中的保持帧率在60fps(理想状态下)的问题。
- 对于排版,绘制,UI 对象操作这三项,前两项已经被 AsyncDisplayKit 扔到后台线程,因此在渲染层面将有显著性能提升;
- AsyncDisplayKit原理分析 https://www.jianshu.com/p/21f3d46b1bc5
UIImage加载图片
- imageNamed:
这种方法在图片加载完成后进行缓存,下次获取读取缓存图片; 但是会一直占用内存,就算指向nil内存还是存在;如果读取的本地图片过大,采用这种方式加载会消耗大量内存 - imageWithContentsOfFile:
仅加载图片,图像数据不会缓存,图像会被系统以数据方式加载到程序。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗;在获取开机页大图或引导图这种只使用一次且图片较大的情况建议采用这种方式;
离屏渲染
- 在使用圆角、阴影和遮罩等视图功能的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制,所有就需要在屏幕外的上下文中渲染,即离屏渲染。
- 离屏渲染之所以会特别消耗性能,是因为要创建一个屏幕外的缓冲区,然后从当屏缓冲区切换到屏幕外的缓冲区,然后再完成渲染;其中,创建缓冲区和切换上下文最消耗性能,而绘制其实不是性能损耗的主要原因
- 设置以下属性时,就会触发离屏渲染
1.shouldRasterize(光栅化)
2.masks(遮罩)
3.shadows(阴影)
4.edge antialiasing(抗锯齿)
5.group opacity(不透明)
6.复杂形状设置圆角等
7.渐变
离屏渲染检测
-
模拟器的 debug -> 选取 color Offscreen-Rendered; 黄色部分产生了离屏渲染
- 使用 Instruments -> Core Animation 来监测离屏渲染和离屏渲染相关的检查选项:
开启Color Offscreen-Rendered Yellow 或 Color Hits Green and Misses Red
具体参见:https://www.jianshu.com/p/439e158b44de