Бесит, когда приложение каждый день фризит и лагает?
Одна из самых явных причин этой проблемы в неоптимизированном UI-слое на Jetpack Compose (когда UI-ная часть сделана на этом фреймворке). Давайте сегодня разберем 2 конкретных способа разгрузить рекомпозицию и немного пощадить ресурсы, а также батарею пользователя. ++ 1. Отложенное чтение стейта.++ Главный враг Compose - частое изменение входящих данных. Если передаваемые в composable метод данные изменяются по множеству раз, в таком случае компилятор триггерит рекомпозицию всего родительского метода и древа дочерних методов (входящих в родительсикй) каждый раз при изменении той прямой переменной, которую передали в конструктор. Решение: передавать в конструктор лямбду, а не сам примитив. К примеру, вместо counter: Int мы можем передавать counter: () -> Int. Это обеспечивает стабильность параметров — композируемая функция получает лямбду, а не живую ссылку на переменную, значений которой постоянно меняется и триггерит рекомпозицию всего дерева вместе с дочерними элементами Казалось бы мелочь, а профит уже получен! Таким образом будет триггериться рекомпозиция только того метода, который будет считывать результат переданных в лямбду данных
2. Оптимизация анимаций (Шиммеры). Тяжелые плавающие анимации — это постоянные вычисления. Если вешать их на стандартные модификаторы (тот же .background(), они будут запускать рекомпозицию на каждый кадр. Решение: использовать блок .graphicsLayer {}. Он меняет свойства (alpha, scale и др.) только на этапе отрисовки, работая напрямую с runtime.State. О великой пользе данного модификатора и говорить нечего, ведь сами разработчики Jetpack Compose прямо в своем KDoc к этому модификатору указывают, что именно так лучше и использовать его. Благодаря .graphicsLayer() Compose создаёт отдельный графический слой, и анимация работает значительно дешевле для системы. Море неоптимизированного кода становится меньше → меньше жрёт батарею и память.
Надеюсь данная мини статейка о легких фичах оптимизации движка compose была интересна! В замен расскажите о том, какие фичи оптимизации вы используете в своих проектах)