Работа с изображениями может быстро привести к проблемам с производительностью, если вы не будете осторожны. Вы можете легко столкнуться с ошибкой OutOfMemoryError
при работе с большими растровыми изображениями. Следуйте этим рекомендациям, чтобы обеспечить максимальную производительность вашего приложения.
Загружайте только тот размер растрового изображения, который вам нужен.
Большинство смартфонов оснащены камерами высокого разрешения, которые создают большие файлы изображений. Если вы показываете изображение на экране, вам необходимо либо уменьшить разрешение изображения, либо загружать изображение только до размера вашего контейнера изображений. Постоянная загрузка изображений большего размера, чем необходимо, может истощить кэши графического процессора, что приведет к снижению производительности рендеринга пользовательского интерфейса.
Чтобы управлять размерами изображений:
- Уменьшите файлы изображений до как можно меньшего размера (не затрагивая выходное изображение).
- Рассмотрите возможность преобразования изображений в формат WEBP вместо JPEG или PNG.
- Предоставляйте изображения меньшего размера для разных разрешений экрана (см. совет № 3 ).
- Используйте библиотеку загрузки изображений , которая уменьшает изображение до размера вашего изображения на экране. Это может помочь улучшить производительность загрузки вашего экрана.
Используйте векторы вместо растровых изображений, где это возможно.
Представляя что-то визуально на экране, вам необходимо решить, можно ли это представить в виде вектора или нет. Предпочитайте векторные изображения растровым изображениям, поскольку они не пикселизируются при масштабировании до разных размеров. Однако не все можно представить в векторном виде — изображения, снятые фотоаппаратом, невозможно преобразовать в вектор.
Предоставьте альтернативные ресурсы для разных размеров экрана.
Если вы отправляете изображения вместе с приложением, рассмотрите возможность предоставления ресурсов разного размера для разных разрешений устройств. Это может помочь уменьшить размер загрузки вашего приложения на устройствах и повысить производительность, поскольку на устройство с более низким разрешением будет загружаться изображение с более низким разрешением. Дополнительную информацию о предоставлении альтернативных растровых изображений для устройств разных размеров см. в документации по альтернативным растровым изображениям .
При использовании 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-анализатора , чтобы убедиться, что вы не упаковываете файлы изображений, размеры которых превышают требуемые. Уменьшите размеры или рассмотрите возможность размещения изображений на сервере и загрузки их только при необходимости.
{% дословно %}Рекомендуется для вас
- Примечание. Текст ссылки отображается, когда JavaScript отключен.
- ImageBitmap против ImageVector {:#bitmap-vs-vector}
- Сохранение состояния пользовательского интерфейса в Compose
- Фазы создания реактивного ранца