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

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

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

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

Чтобы управлять размерами изображений:

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

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

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

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

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

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

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

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

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

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

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

}

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

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

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

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

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