Разбор 25 сентября 2026 · iPhone и Android
Ускорение «По душе»
Что делает приложение медленным, что можно ускорить без изменения вида и почему на iPhone не стоит переходить на карты Apple.
Коротко
Почему медленно
Приложение каждый раз заново спрашивает сервер и ничего не держит в памяти
При открытии карты уходит около 15 запросов, часть из них повторяется, при каждом возврате ещё около 10. Загрузка начинается только после перехода между экранами, а он длится 0,7 с. Списки сразу строят все карточки и качают все фото целиком.
Почему греется
Лишняя перерисовка и расчёты в главном потоке
Бегущий блик на загружающихся обложках до 120 раз в секунду перерисовывает весь список, а на iPhone ещё и стеклянные размытия. Ответы сервера разбираются там же, где рисуется экран.
Карты Apple
Не переходить: их нельзя раскрасить под макет
Карта в России медленная из-за сети, а не из-за движка: плитки нашей карты идут через Cloudflare, а его режут российские провайдеры. Выход — копия карты на российском сервере. Вид при этом не меняется.
Ход работ 25 сентября: этап 1 и переходы по макету сделаны и проверены — все 623 экрана выглядят как раньше (единственная разница с 1816 — давний край рамки мини-карты в фильтрах); копия карты работает на стенде dusha, приложение берёт карту оттуда. Этап 2 («газ делать дальше») сделан: одинаковые одновременные запросы идут одним, открытое событие видно сразу при повторном открытии, страница события не перезагружает профиль, лента свайпов не пустеет на 11-й карточке, помнит место и заранее качает фото, маркеры карты на iPhone готовятся в фоне. Два помощника прошли его руками на Android и на iPhone — поломок нет. По их замечаниям страница события открывается сразу, а профиль и чат больше не мигают пустым состоянием; на Android карта при возврате на «Афишу» больше не мелькает пустым полем. Сборки: iPhone 0.2.0 (260925.1609) — в TestFlight, Android 0.2.0-260925.1606 — на стенде. Отложено: новая версия сетевой библиотеки для iPhone (макмини не скачивает её через VPN), подготовка экрана приветствия заранее и встроенные шрифты карты (после копии карты в России выигрыш мал).
Решения 25 сентября: делаю этап 1; переходы привожу к прототипу Figma; копию карты поднимаю на дев-стенде dusha; карты Apple не берём, ускоряем нашу. Этапы 2 и 3 и остальные пункты из раздела «Нужно ваше решение» — только после отдельного «да».
Всё в плане ниже оставляет вид прежним, пиксель в пиксель. После каждой правки проверяю все 623 экрана против прежней сборки и снимаю живые экраны до и после. То, что может хоть немного поменять вид или движение, вынесено в отдельный раздел «Нужно ваше решение», и без вашего «да» я этого не делаю.
План: вид не меняется
Сначала самые дешёвые правки с самым заметным эффектом. Для каждой указано время работы, какой телефон она касается и нужен ли сервер.
вид тот же
оба · iPhone · Android
нужен сервер
часы работы
Этап 1 · быстрые правки
около 2 дней · только приложение
-
Не загружать афишу заново во вкладках «Чаты» и «Профиль»
Сейчас каждое открытие этих вкладок заново скачивает всю афишу: около 6 запросов и 200 КБ данных, хотя там нужны только обложки и районы.
вид тот жеоба1 ч
-
Разбирать ответы сервера в фоне
Страница афиши из 50 событий (около 200 КБ текста) сейчас разбирается в том же потоке, что рисует экран, и экран в это время подтормаживает.
вид тот жеоба1 ч
-
Начинать загрузку сразу при открытии экрана
Список чатов, аватар в ленте свайпов и обновление карты ждут, пока закончится переход. Если начинать сразу, данные придут на 0,7 с раньше.
вид тот жеоба1–2 ч
-
Одно подключение для чатов
Сейчас каждый открытый чат заводит новое сетевое подключение и не закрывает его. Память течёт, и чем больше чатов открыто, тем тяжелее приложению.
вид тот жеоба1–2 ч
-
Анимации загрузки перерисовывают только себя
Блик на обложках и кружок загрузки будут перерисовывать только свою рамку, а не весь экран. Это главный источник нагрева во время загрузки.
вид тот жеоба1–2 ч
-
Размытия считать один раз и хранить
Свечение мини-карты в фильтрах, экран приветствия и анкета заново считают размытия при каждом показе, а «стекло» создаёт эффект заново на каждом кадре. Тени мы храним так с 24 сентября, остальное сделаю так же.
вид тот жеоба3–4 ч
-
iPhone: хранить фото в постоянной папке
Сейчас кэш картинок лежит во временной папке, которую iOS чистит, пока приложение закрыто, и после перезапуска все фото качаются заново. Ещё научу приложение освобождать память, когда iOS об этом просит.
вид тот жеiPhone1–2 ч
-
Карта: хранить больше плиток на телефоне
Память под карту — с 50 до 300 МБ. Места, которые человек уже смотрел, будут открываться без сети.
вид тот жеоба0,5 ч
-
Закрепить версию движка карты и режим сборки
Версия карты на iPhone сейчас может обновиться сама при следующей сборке, а тестовая сборка Stage собирается в отладочном режиме. Без этого замеры «до и после» будут сбиваться.
вид тот жеiPhone0,5–1 ч
Этап 2 · память приложения, лента, карта
около недели
-
Память приложения: сначала прошлые данные, потом свежие
Экран сразу показывает то, что приложение уже знает, и тихо обновляет данные в фоне. Одинаковые запросы не повторяются, а после записи на событие или правки профиля обновляется ровно то, что изменилось. Ожидаю на 60–70% меньше запросов при открытии карты и возврате на неё. Вкладки будут открываться уже заполненными.
вид тот жеоба1,5–2 дня
-
Лента свайпов без пустого экрана
Сервер отдаёт карточки по 10. На 11-й лента показывает пустую страницу, пока грузит следующие, фото следующей карточки не качается заранее, а после выхода лента начинается заново. Буду подгружать карточки за 3 до конца, заранее качать фото 2–3 следующих и помнить место в ленте.
вид тот жеоба4–6 ч
-
Событие: грузить при нажатии
Данные события начнут грузиться, как только палец коснулся карточки, а не после перехода. Профиль (около 6 запросов) больше не будет перезагружаться при каждом открытии события.
вид тот жеоба2–3 ч
-
Карта: шрифты, значки и стиль внутри приложения
Сейчас их каждый раз качают через Cloudflare, и подписи на карте появляются после 4–6 запросов по цепочке. Встроенные в приложение, они займут около 0,9 МБ и заодно уберут небольшую разницу в стиле карты между iPhone и Android.
вид тот жеоба4–6 ч
-
Карта: копия на российском сервере
С 9 июня 2025 года крупные провайдеры России (Ростелеком, МегаФон, Билайн, МТС) обрезают загрузку с Cloudflare после первых 16 КБ. Плитки Москвы весят 40–300 КБ, поэтому на мобильном интернете карта грузится десятки секунд или не грузится вовсе. Копия на нашем сервере в России отдаёт те же плитки, поэтому пиксели те же. Заодно адреса плиток перестанут меняться: сейчас OpenFreeMap меняет их каждую неделю, и сохранённая на телефоне карта раз в неделю перестаёт использоваться.
вид тот жеобанужен сервер в России1–1,5 дня
-
iPhone: обновить сетевую библиотеку
В нашей версии Ktor (3.2.3) iPhone копирует каждый кусок ответа лишний раз, и в ней течёт память. Разработчики исправили это в 3.4.2 и 3.4.3. После обновления перепроверю загрузку фото и чаты.
вид тот жеiPhone2–4 ч
-
iPhone: маркеры карты рисовать в фоне
Сейчас каждый маркер рисуется, упаковывается в картинку и распаковывается обратно в главном потоке, поэтому при появлении событий карта подёргивается.
вид тот жеiPhone3–4 ч
-
Первый экран: готовить картинки заранее
Экран приветствия до первого кадра разжимает две фотографии по 4–6 МБ и считает 8 размытий. Если делать это в фоне при запуске, приветствие появится быстрее.
вид тот жеоба3–4 ч
Этап 3 · большие переделки под капотом
1–2 недели
-
Строить только видимые карточки в списках
Афиша, избранное, список чатов и лента чата сейчас строят сразу все карточки и начинают качать все фото при открытии. Буду строить только то, что на экране, и чуть ниже. Каждый экран потом сверяю по снимкам и при прокрутке.
вид тот жеоба1–2 дня на экран
-
Android: профили запуска
Android заранее готовит код самых частых экранов. По данным Google, экраны с первого запуска работают примерно на 30% быстрее, и ещё на 15–30% быстрее старт.
вид тот жеAndroid1–2 дня
-
Прошлые данные на диске для холодного старта
После перезапуска приложение сразу показывает прошлую афишу, ленту и чаты, а потом обновляет их по ответу сервера.
вид тот жеоба1–2 дня
Нужно ваше решение
Эти правки могут изменить движение или пиксели. Без вашего «да» не делаю.
-
Переходы между экранами — как в макете советую
В прототипе Figma 17 переходов, и все они длятся 0,1–0,3 с с плавным замедлением: 10 по 0,3 с и 7 по 0,1 с (например, «Tab Bar → Чаты» — растворение за 0,1 с). У нас сейчас все переходы по 0,7 с: это настройка Android по умолчанию, а не решение дизайна. Если привести к макету, каждый переход станет на 0,4–0,6 с короче, и это самое заметное ускорение из всех.
меняет движениеоба2–3 ч
-
Страница события: неподвижная мини-карта
Такая уже стоит в карточках. Страница откроется быстрее, и на iPhone пропадёт белое поле на месте карты во время перехода. Но карта на этой странице будет рисоваться другим способом.
может изменить видоба2–3 ч
-
Уменьшенные обложки с сервера
43 из 50 обложек на стенде — оригиналы culture.ru примерно по 600 КБ. Если брать уменьшенную копию, как уже делаем для Афиши, трафик резко падает: на примере Афиши 465 КБ превращаются в 9 КБ. Но картинку будет уменьшать сервер, а не телефон, и мелкие детали могут чуть отличаться.
может изменить видобанужен сервер
-
iPhone: аккуратнее уменьшать фото
Библиотека картинок на iPhone уменьшает фото грубым способом, по ближайшей точке. Правильный способ быстрее, требует меньше памяти и ближе к Android, но пиксели изменятся: станут глаже.
меняет пикселиiPhone1 день
-
Реже обновлять анимации загрузки и маленькие карты
Если кружок загрузки и мини-карты обновлять реже, телефон будет меньше греться. Движение станет менее плавным.
меняет движениеоба1–2 ч
-
Обновления библиотек отрисовки
Новые версии Compose и движка карты для Android быстрее, но меняют отрисовку. Делать только отдельной задачей и с полной сверкой всех 623 экранов.
может изменить видоба
Заглушки-скелеты и лишние индикаторы загрузки не предлагаю. Их нет в макете, а с памятью приложения большинство экранов будут открываться быстрее чем за секунду, и индикатор не понадобится.
Карты Apple на iPhone
Вывод: не переходить. Оставить нашу карту и ускорить её: вид сохранится, и выигрыш будет на обоих телефонах.
Карты Apple нельзя раскрасить под макет.Apple даёт только обычную или приглушённую схему, фильтр мест, пробки и здания. Своих цветов нет, шрифт и подписи — Apple, язык подписей берётся из настроек телефона, а логотип Apple и ссылка «Правовая информация» обязаны быть видны. Карта перестанет совпадать с макетом и с Android.
Отрисовка — не узкое место.Наша карта на iPhone уже работает на графике Apple (Metal) и выдаёт до 120 кадров в секунду (MapLibre 6.31). Честных сравнений, где карта Apple рисует быстрее, я не нашёл.
Медленно из-за сети.Плитки, шрифты и значки нашей карты идут через Cloudflare, а его в России обрезают. Карты Apple грузятся со своих серверов, поэтому и кажутся быстрее. Такой же выигрыш даст копия нашей карты на российском сервере, причём и на iPhone, и на Android, без изменения вида.
Переход дорогой.60–90 часов работы плюс проверка, и дальше придётся поддерживать два разных движка карт: Android остаётся на нашей карте.
| Карты Apple | Наша карта сейчас | Наша карта ускоренная |
| Совпадает с макетом | Нет: только обычная или приглушённая схема | Да, раскрашена под макет | Да, пиксели те же |
| iPhone и Android одинаковы | Нет | Почти одинаковы | Одинаковы |
| Подписи на русском | Как язык телефона | Всегда на русском | Всегда на русском |
| Отрисовка | Графика Apple, 120 кадров | Metal, 120 кадров | То же, меньше работы в главном потоке |
| Загрузка в России | Свои серверы Apple | Через Cloudflare, который режут; раз в неделю сохранённая карта сбрасывается | Российский сервер, шрифты и значки внутри приложения |
| Данные по России | Источники Apple не раскрывает | OpenStreetMap, плотно по Москве | То же |
| Цена и правила | Бесплатно, но Apple вправе отозвать доступ | Бесплатно | Плюс небольшой сервер в России |
| Работа | 60–90 ч + проверка | — | Главное — 2–2,5 дня, всё — 4–6 дней |
Как проверим, что стало быстрее
Замеряю до и после каждой правки на одних и тех же сценариях. Цифры покажу в таблице.
- Только выпускные сборки, как у тестировщиков, на настоящих телефонах: iPhone с частотой 120 Гц и без неё и Android-телефон. BlueStacks подходит только для проверки, что всё работает, но не для замеров.
- Две сети: обычный Wi-Fi и сеть, которая, как у российских провайдеров, обрезает Cloudflare после 16 КБ.
- Каждый сценарий не меньше 5 раз. Смотрю обычное время и худшие случаи.
- Сценарии: холодный запуск до карты с маркерами; возврат на карту с другой вкладки; открытие списка; лента свайпов (11 карточек); событие и назад 5 раз; круг по вкладкам; прокрутка длинного чата; 10 минут работы, чтобы измерить нагрев.
- Вид: сверка всех 623 экранов и живые снимки до и после каждого затронутого экрана.