Оптимизация производительности изображений

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

Загружайте только тот размер растрового изображения, который вам нужен

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

Для управления размерами изображений:

  • Уменьшите размер файлов изображений до максимально возможного размера (не влияя на выходное изображение).
  • Рассмотрите возможность преобразования изображений в формат WEBP вместо JPEG или PNG.
  • Предоставьте меньшие изображения для разных разрешений экрана (см. Совет № 3 ),
  • Используйте библиотеку загрузки изображений , которая уменьшает масштаб изображения, чтобы оно соответствовало размеру вашего представления на экране. Это может помочь улучшить производительность загрузки вашего экрана.

По возможности используйте векторы вместо растровых изображений.

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

Предоставьте альтернативные ресурсы для разных размеров экрана

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

При использовании ImageBitmap вызовите prepareToDraw перед рисованием

При использовании ImageBitmap , чтобы начать процесс загрузки текстуры в GPU, вызовите ImageBitmap#prepareToDraw() перед ее фактическим рисованием. Это помогает GPU подготовить текстуру и повысить производительность отображения визуального элемента на экране. Большинство библиотек загрузки изображений уже выполняют эту оптимизацию, но если вы работаете с классом ImageBitmap самостоятельно, об этом следует помнить.

Предпочитайте передавать Int DrawableRes или URL в качестве параметров в ваш компонуемый объект вместо Painter

Из-за сложностей работы с изображениями (например, написание функции equals для Bitmaps было бы вычислительно затратным), API Painter явно не отмечен как класс Stable . Нестабильные классы могут привести к ненужным перекомпозициям, поскольку компилятор не может легко определить, изменились ли данные.

Поэтому предпочтительнее передавать URL-адрес или идентификатор рисуемого ресурса в качестве параметров вашего компонуемого объекта, а не передавать Painter в качестве параметра.

// Prefer this:
@Composable
fun MyImage(url: String) {

}
// Over this:
@Composable
fun MyImage(painter: Painter) {

}

Не храните растровое изображение в памяти дольше, чем оно вам нужно.

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

Не упаковывайте большие изображения в файлы AAB/APK.

Одной из главных причин большого размера загрузки приложения является графика, упакованная в файл AAB или APK. Используйте инструмент анализа APK , чтобы убедиться, что вы не упаковываете файлы изображений большего размера, чем требуется. Уменьшите размеры или рассмотрите возможность размещения изображений на сервере и загрузки их только при необходимости.

{% дословно %} {% endverbatim %} {% дословно %} {% endverbatim %}