Systrace показывает, что PerformTraversals и getDisplayList занимают много времени

У меня есть gridView с 20 пользовательскими компонентами, отображаемыми на экране одновременно (как элементы представления сетки). Прокрутка представления очень прерывистая, и я пытаюсь определить, почему. Моя системная трасса (показанная ниже) показывает огромное количество времени, затраченного на PerformTraversals и getDisplayList (около 40 мс), но я не могу сказать, что они делают. Я добавил пользовательскую трассировку для своих onMeasure, onLayout и onDraw. Все они крошечные по сравнению с ними.

Я не уверен, куда идти дальше, чтобы определить, что занимает все время...

введите здесь описание изображения


person rsteckler    schedule 16.01.2015    source источник
comment
Зайдите на AOSP, посмотрите код этих функций и выясните, что они делают и почему это занимает так много времени? Затем посмотрите, можете ли вы оптимизировать, чтобы избежать этого?   -  person Gabe Sechan    schedule 16.01.2015
comment
Вот и вся работа с представлением иерархии. Вы смотрели на свой пользовательский интерфейс с помощью просмотра иерархии? (developer.android.com/tools/debugging/debugging-ui.html)   -  person fadden    schedule 16.01.2015


Ответы (1)


Так что это оказалось довольно специфичным. Проблема заключалась в том, что мне нужно аннулировать элементы в GridView при прокрутке GridView, потому что это настраиваемые элементы управления, которые необходимо перерисовывать. Из GridView OnScroll я вызывал GridView.invalidateViews(). Это, как оказалось, ОЧЕНЬ медленно. Я заменил его следующим:

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

Этот маленький цикл безумно быстрее, чем invalidateViews. Я не просматривал код, чтобы определить, почему.

Итак, как я определил, что это была проблема? Все эти причудливые инструменты на самом деле не помогли. Вместо этого я использовал старое доброе коммент-джитсу. Я продолжал урезать все, что происходило, когда я прокручивал, и именно эта строка имела значение. Мои кадры увеличились с ~ 50 мс до ~ 8 мс.

person rsteckler    schedule 17.01.2015