На этой странице объясняется, что такое перерасход средств, как его диагностировать и как его устранить или уменьшить.
Когда приложение отрисовывает один и тот же пиксель более одного раза в течение одного кадра, это называется перерисовкой . Перерисовка обычно не нужна, и лучше всего её устранить. Перерисовка становится проблемой производительности, когда она тратит время графического процессора на отрисовку пикселей, которые не влияют на то, что пользователь видит на экране.
О перерасходе средств
Перерисовка (overdraw) означает, что система многократно отрисовывает пиксель на экране в одном кадре рендеринга. Например, если у вас есть стопка карточек пользовательского интерфейса, каждая карточка скрывает часть карточки под ней. Однако системе все равно необходимо отрисовать скрытые части карточек в стопке. Это связано с тем, что карточки в стопке отрисовываются в соответствии с алгоритмом отрисовки — то есть, в порядке от заднего плана к переднему. Такая последовательность отрисовки позволяет системе применять правильное альфа-смешивание к полупрозрачным объектам, таким как тени.
Выявление проблем с перерасходом средств
Платформа предлагает следующие инструменты, которые помогут вам определить, влияет ли избыточное выделение ресурсов на производительность вашего приложения.
Инструмент отладки перерисовки графического процессора
Инструмент Debug GPU Overdraw использует цветовую кодировку для отображения количества отрисовок каждого пикселя на экране вашим приложением. Чем выше это значение, тем больше вероятность того, что перерисовка повлияет на производительность вашего приложения.
Для получения дополнительной информации см. раздел «Визуализация перерисовки графического процессора» .
Инструмент профилирования рендеринга на графическом процессоре
Инструмент «Профилирование рендеринга на графическом процессоре» отображает время, необходимое для каждого этапа конвейера рендеринга для отображения одного кадра, в виде прокручиваемой гистограммы. Часть каждой полосы, обозначенная оранжевым цветом, показывает, когда система обменивается буферами. Этот показатель дает важные сведения о перерисовке.
На менее производительных графических процессорах доступная скорость заполнения — скорость, с которой графический процессор может заполнять буфер кадра — может быть низкой. По мере увеличения количества пикселей, необходимых для отрисовки кадра, графическому процессору может потребоваться больше времени для обработки новых команд, и остальная часть системы может ждать, пока он не сможет наверстать упущенное. Индикатор процесса показывает этот скачок, поскольку графический процессор перегружен, пытаясь отрисовать пиксели как можно быстрее. Проблемы, помимо самого количества пикселей, также могут вызывать скачки этого показателя. Например, если инструмент отладки перерисовки графического процессора показывает сильную перерисовку и скачки процесса , вероятно, есть проблема с перерисовкой.
Для получения более подробной информации см. раздел «Профиль скорости рендеринга на графическом процессоре» .
Исправить перерасход средств
Для уменьшения или устранения перерасхода средств можно предпринять следующие действия:
- Удалите ненужный фон из макетов.
- Снизьте прозрачность.
В этом разделе представлена информация об обоих подходах.
Удалите ненужный фон из макетов.
По умолчанию макет не имеет фона, а это значит, что он ничего не отображает напрямую. Однако, если макеты имеют фон, они могут способствовать перерисовке.
Вы можете повысить производительность отрисовки, удалив ненужные фоновые элементы, например, фон, который не виден, поскольку полностью перекрывается всем, что приложение отрисовывает поверх него. Например, дочерний Box или макет с модификатором .background может полностью перекрывать фон родительского контейнера, делая проход отрисовки родительского элемента полностью невидимым для пользователя, но при этом полностью обрабатываемым графическим процессором.
Чтобы выяснить причину избыточного отображения, посмотрите на дерево компонентов в инструменте «Инспектор компоновки» . Вы можете найти фоновые изображения, невидимые пользователю, и удалить их. Вы также можете удалить ненужные фоновые изображения там, где несколько контейнеров имеют общий цвет фона. Установите фон окна на основной цвет фона вашего приложения и оставьте все контейнеры над ним без заданных значений фона.
Снизить прозрачность
Отображение прозрачных пикселей на экране, известное как альфа-рендеринг , является ключевым фактором перерисовки. В отличие от стандартной перерисовки, когда система полностью скрывает уже отрисованные пиксели, отрисовывая поверх них непрозрачные пиксели, для прозрачных объектов необходимо сначала отрисовать существующие пиксели, чтобы могло сработать правильное уравнение смешивания.
Визуальные эффекты, такие как прозрачная анимация, затухание и тени, включают в себя некоторую прозрачность и, следовательно, могут значительно способствовать перерисовке. В таких ситуациях можно уменьшить перерисовку, сократив количество отображаемых прозрачных объектов. Например, вы можете получить серый текст, нарисовав черный текст в компоненте Text и применив полупрозрачное значение альфа-канала с помощью modifier = Modifier.alpha(0.5f) . Однако вы можете добиться того же эффекта с лучшей производительностью, напрямую установив цвет текста компонента на непрозрачный серый: color = Color.Black.copy(alpha = 0.5f) .
Чтобы узнать больше о затратах на повышение производительности, которые накладывает прозрачность на весь процесс создания чертежей, посмотрите видео «Скрытые издержки прозрачности» .