Systrace显示performTraversals和getDisplayList需要很长时间

时间:2015-01-16 01:17:40

标签: android performance systrace

我有一个gridView,一次在屏幕上显示20个自定义组件(作为网格视图项)。滚动视图非常不稳定,我试图确定原因。我的systrace(如下所示)显示了在performTraversals和getDisplayList(大约40ms)上花费了大量时间,但我不能告诉他们他们在做什么。我为onMeasure,onLayout和onDraw添加了自定义跟踪功能。通过比较,这些都是 tiny

我不知道下一步该去哪里确定一直在吸收什么...

enter image description here

1 个答案:

答案 0 :(得分:5)

所以这最终变得非常具体。问题是我需要在GridView滚动时使GridView中的项无效,因为它们是需要重绘自定义控件的自定义控件。从GridView OnScroll,我调用了GridView.invalidateViews()。事实证明,这非常缓慢。我用以下内容替换它:

for(int visiblePosition = 0; visiblePosition <= mGridView.getLastVisiblePosition() - mGridView.getFirstVisiblePosition(); visiblePosition++) {
    mGridView.getChildAt(visiblePosition).invalidate();
}

这个小循环比invalidateViews快得多。我没有查看代码来确定原因。

那么,我是如何确定这是问题所在?所有这些花哨的工具并没有真正帮助。相反,我使用了一些好的ol&#39;评论jitsu。我一直在削减滚动时发生的一切,这就是产生差异的线条。我的帧从大约50ms到大约8ms。