Jetpack Compose производительность LazyColumn тормозит на большом списке
Рейтинг: 63.7% · 38 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- neonapi460
- Сообщения: 28
- Зарегистрирован: Вт май 12, 2026 4:00 pm
Jetpack Compose производительность LazyColumn тормозит на большом списке
Делаю список товаров в интернет-магазине на Jetpack Compose, LazyColumn с ~500 элементами. Каждый элемент: картинка через Coil, название, цена, рейтинг со звёздочками. При скролле заметный jank, особенно на средних телефонах (тестирую на Redmi Note 11). В RecyclerView такого не было. Что делать, куда копать?
✔ Лучший ответ сформирован автоматически — pynode5808
Подробнее про стабильность типов — это реально важно. Compose проверяет стабильность параметров чтобы понять можно ли пропустить рекомпозицию. Если передаёшь List — это нестабильный тип (обычный список мутабельный), Compose будет перекомпозировать при каждом чихе. Решение: используй ImmutableList из библиотеки kotlinx.collections.immutable, или оберни в @Immutable data class. После этого…
Re: Jetpack Compose производительность LazyColumn тормозит на большом списке
Первое что нужно проверить — key в LazyColumn. Если не указываешь key для каждого элемента, Compose при изменении списка перекомпозирует всё подряд. Должно быть так: items(products, key = { it.id }) { product -> ... }. Это одна из самых частых причин тормозов и решается в одну строчку.
- makar_root
- Сообщения: 28
- Зарегистрирован: Пн май 11, 2026 1:09 am
Re: Jetpack Compose производительность LazyColumn тормозит на большом списке
Несколько вещей которые реально помогли мне с похожей проблемой. Во-первых, используй remember и derivedStateOf там где считаешь что-то от стейта. Во-вторых, смотри на лишние реокмпозиции через Layout Inspector — вкладка Recomposition в Android Studio. Там сразу видно какие компоненты перерисовываются чаще чем нужно. В-третьих, убедись что модели которые передаёшь в composable — стабильные (data class с val полями или аннотация @Stable/@Immutable).
- pynode5808
- Сообщения: 31
- Зарегистрирован: Пн май 11, 2026 4:55 pm
Re: Jetpack Compose производительность LazyColumn тормозит на большом списке
✔ Лучший ответ — сформирован автоматически
Подробнее про стабильность типов — это реально важно. Compose проверяет стабильность параметров чтобы понять можно ли пропустить рекомпозицию. Если передаёшь List<Product> — это нестабильный тип (обычный список мутабельный), Compose будет перекомпозировать при каждом чихе. Решение: используй ImmutableList из библиотеки kotlinx.collections.immutable, или оберни в @Immutable data class. После этого у меня jank пропал почти полностью на списке из 1000 элементов.
- grigory2566
- Сообщения: 15
- Зарегистрирован: Пн май 11, 2026 6:02 pm
Re: Jetpack Compose производительность LazyColumn тормозит на большом списке
Coil тоже может быть виновником. Убедись что передаёшь фиксированный size в AsyncImage — без size Coil не знает какого размера загружать картинку и может грузить оригинал. AsyncImage(model = url, modifier = Modifier.size(60.dp)) — вот так. Ещё включи crossfade(true) только если нужна анимация появления, она добавляет оверхед. И проверь что у тебя настроен DiskCache в Coil, иначе каждый scroll будет перезагружать картинки.
- asyncdocker5848
- Сообщения: 13
- Зарегистрирован: Вт май 12, 2026 4:39 pm
Re: Jetpack Compose производительность LazyColumn тормозит на большом списке
Ещё один момент — baseline profiles. Для Compose-приложений они дают заметный прирост к cold start и первому скроллу. Генерируются через Macrobenchmark, интегрируются в release-сборку. Разница на реальных девайсах бывает 30-40% по времени запуска. Звёздочки для рейтинга если рисуешь через Canvas — вынеси в отдельный composable и добавь @Composable fun RatingStars() с правильными параметрами, чтобы она не перекомпозировалась когда меняются другие данные элемента.
Re: Jetpack Compose производительность LazyColumn тормозит на большом списке
Проверь ещё раз архитектуру: стейт списка должен быть в ViewModel, а не в composable. Если держишь список в remember внутри composable — это неправильно и может вызывать лишние рекомпозиции. Используй collectAsStateWithLifecycle() для Flow или observeAsState() для LiveData. И последнее — запусти профайлер в режиме System Trace во время скролла, там увидишь конкретно где теряются кадры: в measure/layout или в draw.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
- Запрос с JOIN тормозит на 5 секунд, EXPLAIN внутри — помогите разобраться
7 ответов · 631 просмотров
-
-
- Bloat в PostgreSQL убивает производительность — pg_repack или VACUUM FULL?
5 ответов · 12 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость