Господа, у всех lazycolumn адово лагает? Сделал lazycolumn, внутри которого: Row - Column --

Text
-- Text
-- Text
- Column
-- Text
-- Text
-- Text
- Column
-- Text
-- Text
-- Text
- Column
-- Text
-- Text
-- Text

Лагает скроллинг так, что использовать программу невозможно. Типа 5-10 фпс +-. И это при том, что данные уже подготовленные вставляются в Text, не нагружают mainthread.
Какой есть выход из ситуации? До композа использовал drawText на canvas, так там намека на лаги не было. А в композе drawText нету, зависить чисто от Android'овского канваса не хочу.

42 ответов

54 просмотра

А вы в релизной сборке смотрите?

X- Автор вопроса
Magenta Soup
А вы в релизной сборке смотрите?

И в дебаг, и в релизной. В релизной чуть получше, но где-то уровня iPhone 3G без рисования на канвасе. Помню те времена...

А много текста?

X- Автор вопроса
Сергій Я.
А много текста?

12 вызовов Text в одной строке. 14 строк вмещается на экране

X- Автор вопроса

Сравнение реализации на композе и на канвасе Android. Слабонервным первое видео не смотреть

X- Автор вопроса

Сравнение реализации на композе и на канвасе Android. Слабонервным первое видео не смотреть

Nikolay
жёстко, пока что посижу на xml ещё

Большое спасибо за сигнал. На этом отдельном отрицательном примере мы мобилизуем общественность, поднимем массы... 😀

X- Автор вопроса
Алексей Гладков
А это дебаг сборка или релиз?

Оба видео дебаг сборка. Релиз сборка даёт на несколько кадров больше, но лучше ситуация не становится

Мне все-таки кажется что тут вся проблема в постоянной рекомпозиции.

X- Автор вопроса
Trump
А с какой биржи апи берете?

Там разные. Бинанс, Битмекс, московская, Санкт-Петербургская биржи (российские через Quik)

Серый плейсхолдер из скелетной части, который заменяется на плейсхолдер с камерой, который потом заменяется на фотку, весь immersion ломает 😜

Алексей Гладков
Мм )) надо подумать )))

Кстати, а как со вложенными нав хостами я буду переходить по внешнему хосту? Буду внутрь прокидывать 2 нав контролера: внутренний и внешний?

X- Автор вопроса

Продолжение вчерашней темы. Сегодня сделал дополнительный вариант для тестирования - Compose + Canvas. Итого в тесте принимают участие: - Android View + Canvas (целый view на канвесе) - Compose + Canvas (построчно). - Compose + Text (построчно). @andkulikov, если есть время, не мог бы ты поучаствовать в дискуссии? Или хотя бы после НГ. Прикрепляю записи экрана (много весят, если что). ComposeCanvas уже почти близок к ViewCanvas, но только если данные не обновляются. А вот если обновляются, то лаги сильные. Нужно минимум 3 раза в секунду данные обновлять. Собственно, вопрос в том, как сделать ComposeText (в идеале) или хотя бы ComposeCanvas таким же производительным, как ViewCanvas при обновлении данных 3 раза у секунду? P.S. это с android:debuggable=false, т.е. как релизная сборка

X
Продолжение вчерашней темы. Сегодня сделал дополни...

самое эффективное это завести баг и приложить код. но сразу скажу что рисование текста на канвасе всегда будет быстрее. для корректного сравнения попробуйте сделать то же самое на вьюхах, где каждый текст это отдельный TextView. поучаствовать в дискуссии готов после 9го. у меня отпуск)

X- Автор вопроса
Andrey Kulikov
самое эффективное это завести баг и приложить код....

Окей, принял) желаю весело провести новогодние праздники)

X
Продолжение вчерашней темы. Сегодня сделал дополни...

Мне любопытно, а зачем в этом конкретном случае canvas вообще? Там же просто разноцветный текст везде. Или я что-то не так понял?

X- Автор вопроса
Arkadii Ivanov
Мне любопытно, а зачем в этом конкретном случае ca...

А какая альтернатива есть, кроме канваса и Text'a?

X
А какая альтернатива есть, кроме канваса и Text'a?

Так просто Text, он же не тормозит? Или тут именно тест на производительность?

X- Автор вопроса
Arkadii Ivanov
Так просто Text, он же не тормозит? Или тут именно...

Так третье видео ComposeText как раз с помощью 12 функций Text в каждой строке. Очень плохая производительность. Канвас без композа показывает в разы лучше FPS

X- Автор вопроса
X
Да

Можно попробовать https://developer.android.com/jetpack/compose/lists#item-keys

X- Автор вопроса
Arkadii Ivanov
Можно попробовать https://developer.android.com/je...

Я ключи делаю, да. Но это вряд ли про производительность, скорее помогает при смене сортировки, что мне очень кстати

X
Я ключи делаю, да. Но это вряд ли про производител...

Не уверен как работают кишки, но в теории это сможет позволят избегать рекомпозиции неизменённых элементов.

X- Автор вопроса
Arkadii Ivanov
Не уверен как работают кишки, но в теории это смож...

Это в теории, а на практике ключом в моём случае является уникальная строка из объекта, а изменился объект или нет, композ не знает. Да и это мало поможет, т.к. часто бывает, что все видимые объекты реально изменяются

X
Это в теории, а на практике ключом в моём случае я...

Моё понимание такое, что композ сможет понять, какие из изменённых объектов сейчас видимы, и обновит только их. Например если изменилась 1000 объектов, а видно только 10 где-то посередине.

X- Автор вопроса
Arkadii Ivanov
Моё понимание такое, что композ сможет понять, как...

Логи показывают, что видимые строки рекомпозируются независимо от изменения или не изменения объекта. Тупо выводил логи в lazyColumn и наблюдал, какие индексы перерисовываются. Тут проблема не в том, что рекомпозируются, а в том, что долго. И не совсем понятно, почему так. Ведь даже на канвасе из композа не получается достичь скорости View + Cancas. Что как бы неприятно, учитывая, сколько дней я посвятил переписыванию всей той страницы на композ) придётся теперь брать прежний вариант, пока не найду решение. И ещё в новой версии композа поломали связку webview и pager (не скроллится ни вниз, ни вверх), теперь вынужден сидеть на старой версии + на котлине 1.5. Такие дела.

X
Логи показывают, что видимые строки рекомпозируютс...

Я смог воспроизвести лаги с максимально простым LazyColumn { Row { Text Text Text Text } } и списком на 1000 элементов. Профайлер показывал, что тормозит именно рекомпозиция в композ. А точнее некий метод groupObjects, если я ничего не путаю. PS: рекомпозиция не рано перерисовка.

X- Автор вопроса
Arkadii Ivanov
Я смог воспроизвести лаги с максимально простым La...

А количество элементов влияет? Потому как у мены с разным количеством так получается одинаково

Arkadii Ivanov
Я смог воспроизвести лаги с максимально простым La...

А киньте этот пример на гит где вы воспроизвели . Интересно посмотреть

X
Логи показывают, что видимые строки рекомпозируютс...

Есть подозрение, что что-то не так готовишь. Разумеется, если 3 раза в секунду рекомпозируется (и перерисовывается) каждый элемент на экране — это тяжёлая операция. Я не предлагаю решение и, возможно, всё сделано как надо, а это просто какой-то баг\неоптимизированный кусок. Но, рекомпозировать (и перерисовывать) нужно только те элементы, у которых что-то поменялось.

Konstantin Dovnar
Есть подозрение, что что-то не так готовишь. Разу...

As we discussed, recomposing the entire UI tree can be computationally expensive, which uses computing power and battery life. Compose solves this problem with this intelligent recomposition. https://developer.android.com/jetpack/compose/mental-model#recomposition

X- Автор вопроса
Konstantin Dovnar
As we discussed, recomposing the entire UI tree ca...

Прочитал статью полностью. Нет там ничего, что бы говорило о неправильном подходе. У функций моих нет sideeffect'ов. Есть тупо val data by remember { someMutableStateWithHashMap }. После идёт HorizontalPager, в котором LazyColumn с items(data[page]). Ещё указываю ключ в items и дальше идёт Row с тремя Column и 12 Text. Каждый Text просто отображает одно значение из предоставленного объекта. Все. Т.е. никаких тяжелых операций, внешних изменений и т.д. Профайлинг показывает, что mainthread используется исключительно композом (однако это не означает, что я правильно его "готовлю"). Мне кажется, если вы просто создадите LazyColumn с 12 Text и будете её обновлять 3 раза в секунду, сложно будет не увидеть просадок в FPS. А ведь ещё использую Column с weight'ами, дабы пространство поделить на 4 столбика с разным коэффициентом. Причём у меня Text имеет фиксированную ширину, дабы даже тут уменьшить напряг для композа

X
Прочитал статью полностью. Нет там ничего, что бы ...

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

Похожие вопросы

Обсуждают сегодня

Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
2
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
Решил тут попробовать embassy на bluepill. Все установил, собрал blink и успешно залил с помощью St link 2 китайского. Но после этого чип шиться перестал. На форумах прочел, ч...
Lukutin R2AJP
6
Привет!) Кто как юзает переменные в строках?) Чисто ради интереса Вот так: echo "У меня {$bananasAmount} бананов"; Или вот так: echo "У меня ${bananasAmount} бананов";
Виталий
3
Карта сайта