【性能工具】Perfetto中如何分析主线程为何进入sleep状态
一、问题背景
在一次tab切换平移动画过程中,出现了明显丢帧,抓取trace看主线程有57ms时间是处于sleep状态的,这个sleep时间区间内主线程什么也做不了,trace截图如下:
二、卡顿情况下的帧率计算结果
以上滑动区间内计算的帧率是45fps,画面不流畅,需要分析优化:
perfetto上没有像systrace那么明显的指出主线程进入sleep状态的信息,因此需要在主线程进入sleep和离开sleep状态的边界点进行分析:
三、分析进入sleep状态的思路
3.1 进入sleep状态
从trace上找到进入sleep状态的前一个状态点击运行状态信息,能看到下一个状态就是sleep状态,sleep状态持续57ms:
从以上信息我们只能知道是哪里进入sleep状态的,会持续多久,并不能知道是谁导致的进入sleep状态。
3.2 离开sleep状态
继续看离开sleeping状态的过程,继续点击next state按钮,sleeping状态的next state是Runnable状态,是一个中间状态,每次进入Running状态必须先进入Runnable状态的:
看红色框住的信息可以看到有注明线程进入Runnable状态是被谁唤醒的,这里是被pid=19180的进程的tid=23674,name=TVKPlayerManag的线程唤醒的,看到这里就能确认是因为主线程等待23674的某个条件满足导致进入sleeping状态,一般常见的比如线程同步锁,被子线程持有了,然后主线程也需要获取到同步锁才能继续下一行执行代码,也是会出现该现象。