пятница, 17 февраля 2012 г.

Android Training-Улучшение производительности разметок-Оптимизация иерархий разметок

Разметки(Layouts) являются ключевой частью Android приложений, которая непосредственно влияет на user experience. Плохая реализация вашей разметки может привести к приложению, требующему большое количество оперативной памяти для работы и медленный UI. Android SDK включает в себя утилиты для того, чтобы помочь вам найти проблемы в производительности разметки и с учетом знаний, полученных в других уроках дать вам возможность реализовать быстрый интерфейс, требующий минимального объема памяти.


Оптимизация иерархий разметок.


Распространенным заблуждением является мненин о том, что использование базовых струтур разметки ведет к построению самых эфективных разметок. Каждый виджет и разметка, добавляемые в приложение требуют инициализации, разметки и отрисовки. Например, использование вложенных экземпляров LinearLayout может привести к чрезмерно глубокой иерархии. Кроме того, вложение нескольких экземпляров LinearLayout которые используют параметр layout_weight может быть особенно затратно, т.к. каждый компонент-ребенок требует двухразового вычисления. Это осбенноо важно, при частых inflate разметки например при использовании ListView или GridView.
В этом уроке вы узнаете как использовать утилиты Heirachy Viewer и Layoutopt для проверки и оптимизации вашей разметки.
Проверка вашей разметки.
Android SDK включает в себя утилиту, называемую Heirachy Viewer которая позволяет вам анализировать разметку во время работы приложения. Ее использование позволяет найти слабые места в быстродействии разметки.
Hierarchy Viewer работает позволяя вам выбирать запущенные процессы на подключенном устройстве или эмуляторе затем отображая дерево разметки. Светофоры на каждом блоке представляют производительность измерения(Measure), разметки(Layout) и отрисовки(Draw) помогая вам найти потенциальные проблемы.
Например, рисунок 1 показывает разметку, которая используется как элемент списка ListView. Эта разметка показывает небольшое изображение слева и два присоединенных текстовых поля справа. Особенно важно, что если разметка будет вызвана(inflate) много раз—как эта—выигрыш от оптимизации в производительности будет умножаться.

Рисунок 1. Пример разметки.
hierarchyviewer утилиту можно найти в <sdk>/tools/. При открытии, Hierarchy Viewer показывает список доступных устройств и запущенных компонентов. Нажмите Load View Hierarchy для просмотра иерархии разметки выбранного компонента. Для примера, рисунок 2 показывает разметку показанную на рисунке 1.

Рисунок 2. Иерархия разметки использующей вложенные экземляры LinearLayout.
На рисунке 2 вы видите 3-х уровневую иерархию с некоторыми проблемами. Нажатия на элементы показывает время, затраченную на каждую стадию процесса(рисунок 3). Становится ясным, какие элементы требуют больше времени для измерения, разметки и отрисовки и где вы можете заняться оптимизацией:


Рисунок 3. Нажатие на узле иерархии показывает его быстродействие.
Суммарное время для обработки всего элемента управления типа список составляет:
  • Измерение: 0.977мс
  • Разметка: 0.167мс
  • Отрисовка: 2.717мс
  • Пересмотр вашей разметки.
Т.к. быстродействие разметки показанной выше низкое, из-за использования вложенных LinearLayout, попробуем улучшить его выравниваем-сделаем разметку неглубокой и широкой вместо узкой и глубокой. RelativeLayout как ключевой узел подходит для таких разметок. Таким образом, когда наш дизайн преобразится для использования RelativeLayout, вы увидите 2-уровневую иерархию. Проверка новой разметки будет выглядеть так:


Рисунок 4.Иерархия оптимизированной разметки с RelativeLayout.

Теперь отображение списка занимает:
  • Измерение: 0.598ms
  • Разметка: 0.110ms
  • Отрисовка: 2.146ms
Выглядит как небольшое улучшение, но это время умножается много раз, т.к. эта разметка используется как элемент списка.
Большей частью, разница во времени обусловлена из-за использования layout_weight в LinearLayout что очень замедляет время вычисления. Это всего лишь один пример того, как следует грамотно подходить к проектированию разметки и целесообразности использования отдельных параметров.
Использование Layoutopt.
Кроме того, хорошей практикой является запуск утилиты layoutopt на финальных вариантах разметки для поиска мест в вашей иерархии видов которые могут быть оптимизированы. Layoutopt находится в папке SDK tools/ и в качестве параметров принимает путь к директории разметок или разделенный пробелами список файлов разметок которые вы хотите проинспектировать.
При запуске layoutopt с параметром являющимся именем файла разметки, он выводит на экран номера строк, в которых встречаются проблемы, описания проблем и по возможности способы решения проблемы.Например:
$ layoutopt samples/
samples/compound.xml
   7:23 The root-level <FrameLayout/> can be replaced with <merge/>
   11:21 This LinearLayout layout or its FrameLayout parent is useless
samples/simple.xml
   7:7 The root-level <FrameLayout/> can be replaced with <merge/>
Оригинальный материал доступен по адресу

Комментариев нет:

Отправить комментарий