iOS性能优化
性能优化是每一个iOS开发者不可避免的一个话题,一个APP的流畅性决定了用户的体验及留存,本人结合个人经验以及在最近做过的性能优化方面的经验整理(一直没时间整理输出)
提到性能优化,其实网络上有很多类似的文章,大概也就是针对UITableView、视图层级、线程、图片等方面,那么关于性能优化,最根本的底层原理是什么呢?以及应该如何去监控呢?
一:
iOS渲染原理
提到iOS的渲染,需要了解CPU+GPU
iOS的渲染是通过CPU+GPU交互配合来完成的
CPU负责布局的计算、图片解码、复杂文本的绘制等等
GPU负责渲染
iOS显示到屏幕上需要固定的格式,只有经过GPU渲染过的数据才能显示在屏幕上;GPU将渲染过的数据存入到帧缓存区,视图显示器从帧缓存区读取内容,显示到屏幕上;
此处有两个关键点需要明白:
1、iOS采用双缓存机制,前向帧缓存、后向帧缓存,所以渲染效率速度快
2、在显示数据到屏幕上,首先会发送垂直同步信号(VSync),每当发送一个VSync就意味着要开始一帧的渲染工作,然后再发送水平同步信号(HSync),水平同步信号意味着一行一行显示数据,直到当前当前屏幕填充完成;如果一帧的数据渲染完,那么接着再次发送VSync,以此循环

二:
卡顿原因:
CPU计算和GPU渲染都是需要时间的,如果在当前VSync到来之即,需要显示的数据还没有处理好,那么就是显示上一帧的数据,导致当前帧的丢失,即所谓的丢帧情况,而造成卡顿;
知道了具体原因,那么如何去处理呢:
1、Apple官方推荐渲染帧率为60Hz,即1s内屏幕刷新60次,1000/60==16.66,即如果每一个runloop能再16.66ms内处理完成数据,那么就不会出现卡顿的情况
2、降低CPU和GPU的资源消耗,缩短CPU和GPU的处理时间
三:
优化:
1、减少视图的层级关系,减少CPU的计算压力及GPU的重绘(GPU的填充比率是有限的)
2、尽量使用轻量级的组建,在不涉及交互的情况下,使用CALayer来替代UIView
3、减少动态修改视图的frame,bounds,transform等属性,修改属性就会涉及到重新渲染
4、尽量提前计算好布局,在需要的时候一次性调整布局,不要局部调整
5、AutoLayout的使用会比直接设置frame消耗更多的资源
6、UIImage的大小最好与UIImageView的大小一致,避免因为不必要的计算而消耗CPU资源
7、尽量把耗时的任务放入到后台(文本的处理、图片的处理)
文本处理(属性计算、绘制)
图片处理(解码、绘制)
四:
如何检测性能卡顿:
分两种情况监测(本地与线上监测)
1、使用XCode+真机,使用Instraments工具CoreAnimation查看帧率相关性能指标或者XCode->Debug->View Debuging->Render->... 查看混合图层、离屏渲染、光栅化等指标
2、结合runloop运用原理,可以了解到每个runloop都是在kFRunloopBeforeSource与kCFRunloopAfterWaiting之间,可以添加observer在主线程的runloop中,用来监控主线程runloop的运行情况(监控runloop状态切换的耗时),如果超过一定的阀值,那么就抓取当前堆栈信息,上传服务器,通过分析符号化文件找出造成卡顿的相关代码 可参考此文章:Runloop卡顿监控