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