-
之前讲解了TraceView和Systrace的基本使用方式 跳转连接
-
接下来我们通过实例来分析一下是什么原因导致了UI绘制过程中每帧的时间超过了16ms
-
首先我们来看一下通过Android systrace生成的trace.html文件
-
上图中的每帧代表了一个F,当F为红色或者黄色的时候,代表这一帧的时间超过了16ms,我们点击这个红色的帧底部会有Frame标签,如下图。
上图中列举了三个导致绘制时间比较长的原因,measure时间过长,draw时间过长,Scheduling delay(调度延迟)一个线程在处理一块运算的时候,在很长一段时间都没有被分配到CPU上面做运算,从而导致这个线程在很长一段时间都没有完成工作。那么具体是什么原因导致的我们要通过TraceView来分析到底是什么方法导致的。下图是抓取的TraceView的结果图。
上面的选项我们主要关注两点:
- Calls+Recur Calls/Total 某函数被调用次数
- Cpu Time/Call 某函数调用CPU时间与调用次数的比 ,相当于该函数平均执行时间
我们先按照CPU Time/Call排序,排列在首位的是
点开查看如下:
其中有Parents和Children,Parents代表了自身函数,Children代表了内部函数,可以通过右侧的耗时可以看到内部函数的耗时比较长,接下来点开Children的.loop()
同上我们继续点击查看dispatchMessage
点击图中红框的部分查看
其中有几个方法直接指引到了业务代码中。我们可以查看具体的方法来分析比如:下图中请求完网络后hideLoading花费的时间是多少。
比如做本地I/O操作用时
比如下面的部分,我们在总体时间排序上也可以看到通过main的方法查看也可以一步一步的走到这里。
接下来耗时方法的优化就看自己的了。绘制超时的原因还需要通过布局的优化来提高,接下来我们会分析布局的优化。