背景:我在做一个可以滚动的页面的时候插入一个可以播放gif动画的控件,结果发现,如果这个动画在播放的时候,滑动页面会发现卡顿。开始以为是硬件加速问题......最后通过traceview工具发现真正的原因。
android手机开发模式中有一个监控选项下有个属性是gpu显示配置文件,在里面选中以条的形式显示于屏幕。开启之后会发现页面会出现很多的竖线。这个就表示了渲染每帧需要多少时间。按照规则,我们必须要使之小于16ms,
不然就会出现卡顿(失帧)。最下面有一条绿色横线,这个就是16ms分割线,超过这部分的都是大于16ms的。
1蓝色,2橘色,3黄色
注意:使顺利在60帧,每帧必须小于16毫秒完成。
关于Execute:如果执行耗费了过长的时间,这意味着你是跑在前面的图形管线。 android在运行时可以有3个缓冲区.如果你需要另一个应用程序将阻塞直到其中的一个缓冲区释放出来。两个原因会发生这种情况。第一,你的应用在Dalvik中快速绘制但在GPU显示列表时候消耗了大量时间。第二,你的应用程序花了很长的时间来执行第几帧;一旦管线满了他将无法赶上,除非动画完成。
一般都是蓝色部分时间消耗过长。怎么分析呢?
利用android studio下面的android-cpu,在页面展示开始和结束的时候分别点击左边按钮一次,会生成一个.trace文件,如果需要时间更加准确的,可以在activity的onCreate()中添加Debug.startMethodTracing(), 而在onStop中添加Debug.stopMethodTracing();拿到这个.trace文件之后,在android sdk tools目录下,把这个.trace直接丢给traceview.bat。它会自动打开一个视图
接下来,只要选择上方一种颜色跨度最大的分析一下,看看到底是什么方法占用了如此多的时间。
我发现解决的这个问题是因为在onDraw里面写了个Thread.sleep(40)。sleep都sleep40ms了,能不卡么,改成postDelayed,成功分析解决。
原文:http://www.cnblogs.com/liming-saki/p/5164054.html