Проверьте скорость рендеринга графического процессора и перерисуйте

В Android есть несколько встроенных параметров для разработчиков, которые помогают визуализировать возможные проблемы с отрисовкой пользовательского интерфейса вашего приложения, например, выполнение избыточного объема работы по отрисовке или выполнение длительных операций с потоками и графическим процессором. На этой странице описано, как отлаживать избыточную отрисовку графического процессора и профилировать отрисовку графического процессора.

Чтобы узнать больше о параметрах разработчика на устройстве, в том числе о том, как их включить, прочитайте раздел «Настройка параметров разработчика на устройстве» .

Профиль скорости рендеринга на графическом процессоре

Инструмент Profile GPU Rendering отображает в виде прокручиваемой гистограммы визуальное представление времени, необходимого для рендеринга кадров окна пользовательского интерфейса, относительно эталонного значения в 16,67 мс на кадр.

На менее мощных графических процессорах доступная скорость заполнения (скорость, с которой графический процессор может заполнять буфер кадра) может быть довольно низкой. По мере увеличения количества пикселей, необходимых для отрисовки кадра, графическому процессору может потребоваться больше времени для обработки новых команд, в результате чего остальная часть системы будет ждать, пока графический процессор не сможет обработать данные.

Инструмент профилирования помогает определить, когда графический процессор перегружен при попытке отрисовки пикселей или испытывает чрезмерную нагрузку при отрисовке.

Включите профилировщик

Прежде чем начать, убедитесь, что вы используете устройство под управлением Android 4.1 (уровень API 16) или выше, и что у вас включены параметры разработчика . Чтобы начать профилирование рендеринга графического процессора устройства во время работы вашего приложения, выполните следующие действия:

  1. На вашем устройстве перейдите в «Настройки» и нажмите «Параметры разработчика» .
  2. В разделе «Мониторинг» выберите «Профиль рендеринга GPU» или «Профиль рендеринга HWUI» в зависимости от версии Android, установленной на устройстве.
  3. В диалоговом окне «Профиль рендеринга GPU» выберите параметр «На экране в виде столбцов» , чтобы наложить графики на экран вашего устройства.
  4. Откройте приложение, профиль которого вы хотите создать.

Проверьте результат.

На увеличенном изображении графика профилирования рендеринга GPU, показанного на рисунке 1, вы можете увидеть цветной участок, отображаемый на Android 6.0 (уровень API 23).

Рисунок 1. Увеличенный график рендеринга на графическом процессоре.

Ниже приведены несколько моментов, на которые следует обратить внимание при анализе результата:

  • Для каждого видимого приложения инструмент отображает график.
  • Каждая вертикальная полоса вдоль горизонтальной оси представляет собой кадр, а высота каждой вертикальной полосы соответствует времени, затраченному на рендеринг кадра (в миллисекундах).
  • Горизонтальная зеленая линия соответствует 16,67 миллисекундам. Для достижения 60 кадров в секунду вертикальная полоса для каждого кадра должна оставаться ниже этой линии. Любое превышение этой линии может привести к паузам в анимации.
  • Этот инструмент выделяет кадры, превышающие пороговое значение в 16,67 миллисекунд, делая соответствующую полосу шире и менее прозрачной.
  • Каждая полоса имеет цветные компоненты, которые соответствуют этапу конвейера рендеринга. Количество компонентов варьируется в зависимости от уровня API устройства.

В следующей таблице приведено описание каждого сегмента вертикальной полосы в выходных данных профилировщика при использовании устройства под управлением Android 6.0 и выше.

Компонент стержня Этап рендеринга Описание
Буферы обмена Этот параметр показывает время, в течение которого центральный процессор ожидает завершения работы графического процессора. Если этот индикатор становится слишком высоким, это означает, что приложение выполняет слишком большую нагрузку на графический процессор.
Выполнение команды Отображает время, затраченное 2D-рендером Android на отправку команд OpenGL для отрисовки и перерисовки списков отображения. Высота этой полосы прямо пропорциональна сумме времени, необходимого для выполнения каждого списка отображения — чем больше списков отображения, тем выше красная полоса.
Синхронизация и загрузка Отображает время, необходимое для загрузки растровой информации в графический процессор. Большой сегмент указывает на то, что приложение тратит значительное время на загрузку больших объемов графики.
Рисовать Отображает время, затраченное на создание и обновление списков отображения представления. Если эта часть полосы высокая, это может указывать на необходимость большого количества пользовательской отрисовки представления или на значительную нагрузку в методах onDraw.
Замеры / Разметка Отражает время, затраченное на вызовы функций onLayout и onMeasure в иерархии представлений. Большой сегмент указывает на то, что обработка иерархии представлений занимает много времени.
Обработка ввода и анимация Этот сегмент показывает время, затраченное на оценку всех аниматоров, работавших для данного кадра, и обработку всех коллбэков ввода. Если этот сегмент большой, это может указывать на то, что пользовательский аниматор или коллбэк ввода тратят слишком много времени на обработку. Привязка представления во время прокрутки, например, RecyclerView.Adapter.onBindViewHolder() , также обычно происходит в этом сегменте и является более распространенной причиной замедления работы в этой области.
Разное время / Задержка VSync Этот параметр показывает время, которое приложение тратит на выполнение операций между двумя последовательными кадрами. Это может указывать на то, что в потоке пользовательского интерфейса происходит слишком много обработки, которую можно было бы перенести в другой поток.

Таблица 1. Панели компонентов в Android 6.0 и выше.

В версиях Android от 4.0 (уровень API 14) до 5.0 (уровень API 21) присутствуют синие, фиолетовые, красные и оранжевые сегменты. В версиях Android ниже 4.0 присутствуют только синие, красные и оранжевые компоненты. В следующей таблице показаны полосы компонентов в Android 4.0 и 5.0.

Компонент стержня Этап рендеринга Описание
Процесс Этот параметр показывает время, в течение которого центральный процессор ожидает завершения работы графического процессора. Если этот индикатор становится слишком высоким, это означает, что приложение выполняет слишком большую нагрузку на графический процессор.
Выполнять Отображает время, затраченное 2D-рендером Android на отправку команд OpenGL для отрисовки и перерисовки списков отображения. Высота этой полосы прямо пропорциональна сумме времени, необходимого для выполнения каждого списка отображения — чем больше списков отображения, тем выше красная полоса.
XFer Отображает время, необходимое для загрузки информации о растровом изображении в графический процессор. Большой сегмент указывает на то, что приложение тратит значительное время на загрузку большого объема графики. Этот сегмент не отображается на устройствах под управлением Android 4.0 и ниже.
Обновлять Отображает время, затраченное на создание и обновление списков отображения представления. Если эта часть полосы высокая, это может указывать на необходимость большого количества пользовательской отрисовки представления или на значительную нагрузку в методах onDraw.

Таблица 2. Панели компонентов в Android 4.0 и 5.0.

Для получения более подробной информации о том, как интерпретировать данные, предоставляемые инструментом профилирования, ознакомьтесь с разделом «Анализ с помощью профилирования при рендеринге на графическом процессоре» .

Примечание: Хотя этот инструмент называется «Профилирование рендеринга на GPU», все отслеживаемые процессы фактически происходят на центральном процессоре. Рендеринг осуществляется путем отправки команд на графический процессор, и графический процессор асинхронно отображает изображение на экране. В некоторых ситуациях у графического процессора может быть слишком много работы, и центральному процессору придется подождать, прежде чем он сможет отправить новые команды. В этом случае вы увидите всплески на оранжевых и красных полосах, и отправка команд будет блокироваться до тех пор, пока не освободится место в очереди команд графического процессора.

Визуализация перерисовки графического процессора

Еще одна функция в параметрах разработчика помогает выявлять перерисовку с помощью цветовой кодировки пользовательского интерфейса. Перерисовка происходит, когда приложение отрисовывает один и тот же пиксель несколько раз в течение одного кадра. Таким образом, эта визуализация показывает, где приложение может выполнять больше работы по отрисовке, чем необходимо, что может привести к проблемам с производительностью из-за дополнительных усилий графического процессора по отрисовке пикселей, которые не будут видны пользователю. Поэтому следует по возможности исправлять события перерисовки .

Если вы еще этого не сделали, включите параметры разработчика . Затем, чтобы отобразить перерисовку на вашем устройстве, выполните следующие действия:

  1. На вашем устройстве перейдите в «Настройки» и нажмите «Параметры разработчика» .
  2. Прокрутите вниз до раздела «Аппаратное ускорение рендеринга» и выберите «Отладка перерисовки на графическом процессоре» .
  3. В диалоговом окне «Отладка перерисовки графического процессора» выберите «Показать области перерисовки» .

В Android элементы пользовательского интерфейса окрашиваются следующим образом для обозначения степени перерисовки:

  • Истинный цвет: без перетягивания
  • Синий: Перерасход 1 раз
  • Зеленый: Перерасход средств 2 раза
  • Розовый: Перерасход 3 раза
  • Красный: Перерасход средств 4 или более раз

Рисунок 2. Приложение в обычном режиме (слева) и в режиме с включенной функцией перерисовки графического процессора (справа).

Обратите внимание, что эти цвета полупрозрачны, поэтому точный цвет, который вы видите на экране, зависит от содержимого вашего пользовательского интерфейса.

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

Помните, что некоторое перерисовывание неизбежно. При настройке пользовательского интерфейса вашего приложения постарайтесь добиться визуализации, которая отображает в основном истинные цвета или лишь 1-кратное перерисовывание (синий).

Рисунок 3. Примеры приложения с большим количеством перерасхода ресурсов (слева) и с гораздо меньшим количеством перерасхода ресурсов (справа).