前言
本文主要是分享一下自己基于公司项目这一次优化的心得和所遇到的坑,基于列表优化原理,这篇文章 iOS性能优化系列篇之“列表流畅度优化”很清晰的阐述了,可以认真仔细的阅读两遍
遇到的坑:
由于第一次系统的做这一次列表优化,没什么经验,就结合网上耳濡目染提到的什么离屏渲染和图层混合什么的,一直在解决这一块问题,折腾了一天,流畅性并没有什么明显改变,所以得根据具体的项目来分析,这个项目主要是CPU利用率高导致列表卡顿,所以我主要记录一下有效的处理方案
流程
1.基于低配性能的机型运行Release的包
2.Instruments分析,找出具体耗时的函数
3.分析耗时的函数并解决
4.再次运行分析,看耗时函数有没有成功解决
基于低配性能的机型运行Release的包
刚开始做列表优化直接是用的iPhoneX运行的,发现做了代码调整优化后,没有很明显的判断是否生效了,所以我们需要用一个低配的机型来运行,还有苹果基于release的包会做一些优化,并且用户看到的包也为Release的,因此我们要基于低配性能的机型运行Release的包去做优化
Instruments分析,找出具体耗时的函数
启动程序点击XCode选择左上角-XCode->Open Developer Tool ->Instruments,打开Instruments再选择CoreAnimation, 运行真机,滑动列表能看到对应的FPS,选取一段FPS较低的区域
CoreAnimation面板.png再点击Threads切换到对应的线程列表,点击主线程,这时候可以看到主线程调用的函数列表,顶部的weight是按函数总时间(包括函数里调用函数的时间)排序,Selg Weight为每一个函数执行的时间排序
主线程函数列表
这里对右侧call tree选项有必要做一下说明[官方user guide翻译]:
- Separate By Thread
线程分离,只有这样才能在调用路径中能够清晰看到占用CPU最大的线程.
- Invert Call Tree
从上到下跟踪堆栈信息.这个选项可以快捷的看到方法调用路径最深方法占用CPU耗时,比如FuncA{FunB{FunC}},勾选后堆栈以C->B->A把调用层级最深的C显示最外面.
- Hide Missing Symbols
如果dSYM无法找到你的APP或者调用系统框架的话,那么表中将看到调用方法名只能看到16进制的数值,勾选这个选项则可以隐藏这些符号,便于简化分析数据.
- Hide System Libraries
这个就更有用了,勾选后耗时调用路径只会显示app耗时的代码,性能分析普遍我们都比较关系自己代码的耗时而不是系统的.基本是必选项.注意有些代码耗时也会纳入系统层级,可以进行勾选前后前后对执行路径进行比对会非常有用.
这样就能得到基于App耗时大小排序的函数列表, 双击就能显示每个函数耗时在具体哪一行代码,然后具体问题具体分析,修改好后,再运行(有时候没有好的解决办法,可以先注释,然后运行,看看这函数对列表性能的影响程度),看耗时是否降低,依次类推
这样应该卡顿就能解决了,但是在低配的性能手机,快速滑动依然会有掉帧的现象,像微博就做了快速滑动不加载Cell的机制,这样滑动cell都是白屏,优化之路需要不断的尝试,耐心很重要,这里分享的优化仅仅是基于大量的文章基础去每一次尝试得到的经验,同比一线大厂,在低配机型快速滑动上优化还是有一定的差距,也希望大佬能够交流一下优化的心得,一起学习一下
GPU调试的步骤
早起的版本还是在Instrument里调试,现在直接拿到Xcode(有些同学可能找不到,将图附上),具体的优化步骤按照前言里的贴出的文章来就可以,这里就不赘述了
网友评论