Разбор 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 дней · только приложение
  1. Не загружать афишу заново во вкладках «Чаты» и «Профиль»

    Сейчас каждое открытие этих вкладок заново скачивает всю афишу: около 6 запросов и 200 КБ данных, хотя там нужны только обложки и районы.

    вид тот жеоба1 ч
  2. Разбирать ответы сервера в фоне

    Страница афиши из 50 событий (около 200 КБ текста) сейчас разбирается в том же потоке, что рисует экран, и экран в это время подтормаживает.

    вид тот жеоба1 ч
  3. Начинать загрузку сразу при открытии экрана

    Список чатов, аватар в ленте свайпов и обновление карты ждут, пока закончится переход. Если начинать сразу, данные придут на 0,7 с раньше.

    вид тот жеоба1–2 ч
  4. Одно подключение для чатов

    Сейчас каждый открытый чат заводит новое сетевое подключение и не закрывает его. Память течёт, и чем больше чатов открыто, тем тяжелее приложению.

    вид тот жеоба1–2 ч
  5. Анимации загрузки перерисовывают только себя

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

    вид тот жеоба1–2 ч
  6. Размытия считать один раз и хранить

    Свечение мини-карты в фильтрах, экран приветствия и анкета заново считают размытия при каждом показе, а «стекло» создаёт эффект заново на каждом кадре. Тени мы храним так с 24 сентября, остальное сделаю так же.

    вид тот жеоба3–4 ч
  7. iPhone: хранить фото в постоянной папке

    Сейчас кэш картинок лежит во временной папке, которую iOS чистит, пока приложение закрыто, и после перезапуска все фото качаются заново. Ещё научу приложение освобождать память, когда iOS об этом просит.

    вид тот жеiPhone1–2 ч
  8. Карта: хранить больше плиток на телефоне

    Память под карту — с 50 до 300 МБ. Места, которые человек уже смотрел, будут открываться без сети.

    вид тот жеоба0,5 ч
  9. Закрепить версию движка карты и режим сборки

    Версия карты на iPhone сейчас может обновиться сама при следующей сборке, а тестовая сборка Stage собирается в отладочном режиме. Без этого замеры «до и после» будут сбиваться.

    вид тот жеiPhone0,5–1 ч

Этап 2 · память приложения, лента, карта

около недели
  1. Память приложения: сначала прошлые данные, потом свежие

    Экран сразу показывает то, что приложение уже знает, и тихо обновляет данные в фоне. Одинаковые запросы не повторяются, а после записи на событие или правки профиля обновляется ровно то, что изменилось. Ожидаю на 60–70% меньше запросов при открытии карты и возврате на неё. Вкладки будут открываться уже заполненными.

    вид тот жеоба1,5–2 дня
  2. Лента свайпов без пустого экрана

    Сервер отдаёт карточки по 10. На 11-й лента показывает пустую страницу, пока грузит следующие, фото следующей карточки не качается заранее, а после выхода лента начинается заново. Буду подгружать карточки за 3 до конца, заранее качать фото 2–3 следующих и помнить место в ленте.

    вид тот жеоба4–6 ч
  3. Событие: грузить при нажатии

    Данные события начнут грузиться, как только палец коснулся карточки, а не после перехода. Профиль (около 6 запросов) больше не будет перезагружаться при каждом открытии события.

    вид тот жеоба2–3 ч
  4. Карта: шрифты, значки и стиль внутри приложения

    Сейчас их каждый раз качают через Cloudflare, и подписи на карте появляются после 4–6 запросов по цепочке. Встроенные в приложение, они займут около 0,9 МБ и заодно уберут небольшую разницу в стиле карты между iPhone и Android.

    вид тот жеоба4–6 ч
  5. Карта: копия на российском сервере

    С 9 июня 2025 года крупные провайдеры России (Ростелеком, МегаФон, Билайн, МТС) обрезают загрузку с Cloudflare после первых 16 КБ. Плитки Москвы весят 40–300 КБ, поэтому на мобильном интернете карта грузится десятки секунд или не грузится вовсе. Копия на нашем сервере в России отдаёт те же плитки, поэтому пиксели те же. Заодно адреса плиток перестанут меняться: сейчас OpenFreeMap меняет их каждую неделю, и сохранённая на телефоне карта раз в неделю перестаёт использоваться.

    вид тот жеобанужен сервер в России1–1,5 дня
  6. iPhone: обновить сетевую библиотеку

    В нашей версии Ktor (3.2.3) iPhone копирует каждый кусок ответа лишний раз, и в ней течёт память. Разработчики исправили это в 3.4.2 и 3.4.3. После обновления перепроверю загрузку фото и чаты.

    вид тот жеiPhone2–4 ч
  7. iPhone: маркеры карты рисовать в фоне

    Сейчас каждый маркер рисуется, упаковывается в картинку и распаковывается обратно в главном потоке, поэтому при появлении событий карта подёргивается.

    вид тот жеiPhone3–4 ч
  8. Первый экран: готовить картинки заранее

    Экран приветствия до первого кадра разжимает две фотографии по 4–6 МБ и считает 8 размытий. Если делать это в фоне при запуске, приветствие появится быстрее.

    вид тот жеоба3–4 ч

Этап 3 · большие переделки под капотом

1–2 недели
  1. Строить только видимые карточки в списках

    Афиша, избранное, список чатов и лента чата сейчас строят сразу все карточки и начинают качать все фото при открытии. Буду строить только то, что на экране, и чуть ниже. Каждый экран потом сверяю по снимкам и при прокрутке.

    вид тот жеоба1–2 дня на экран
  2. Android: профили запуска

    Android заранее готовит код самых частых экранов. По данным Google, экраны с первого запуска работают примерно на 30% быстрее, и ещё на 15–30% быстрее старт.

    вид тот жеAndroid1–2 дня
  3. Прошлые данные на диске для холодного старта

    После перезапуска приложение сразу показывает прошлую афишу, ленту и чаты, а потом обновляет их по ответу сервера.

    вид тот жеоба1–2 дня

Нужно ваше решение

Эти правки могут изменить движение или пиксели. Без вашего «да» не делаю.

  1. Переходы между экранами — как в макете советую

    В прототипе 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 ч
  2. Страница события: неподвижная мини-карта

    Такая уже стоит в карточках. Страница откроется быстрее, и на iPhone пропадёт белое поле на месте карты во время перехода. Но карта на этой странице будет рисоваться другим способом.

    может изменить видоба2–3 ч
  3. Уменьшенные обложки с сервера

    43 из 50 обложек на стенде — оригиналы culture.ru примерно по 600 КБ. Если брать уменьшенную копию, как уже делаем для Афиши, трафик резко падает: на примере Афиши 465 КБ превращаются в 9 КБ. Но картинку будет уменьшать сервер, а не телефон, и мелкие детали могут чуть отличаться.

    может изменить видобанужен сервер
  4. iPhone: аккуратнее уменьшать фото

    Библиотека картинок на iPhone уменьшает фото грубым способом, по ближайшей точке. Правильный способ быстрее, требует меньше памяти и ближе к Android, но пиксели изменятся: станут глаже.

    меняет пикселиiPhone1 день
  5. Реже обновлять анимации загрузки и маленькие карты

    Если кружок загрузки и мини-карты обновлять реже, телефон будет меньше греться. Движение станет менее плавным.

    меняет движениеоба1–2 ч
  6. Обновления библиотек отрисовки

    Новые версии Compose и движка карты для Android быстрее, но меняют отрисовку. Делать только отдельной задачей и с полной сверкой всех 623 экранов.

    может изменить видоба

Заглушки-скелеты и лишние индикаторы загрузки не предлагаю. Их нет в макете, а с памятью приложения большинство экранов будут открываться быстрее чем за секунду, и индикатор не понадобится.

Карты Apple на iPhone

Вывод: не переходить. Оставить нашу карту и ускорить её: вид сохранится, и выигрыш будет на обоих телефонах.

  1. Карты Apple нельзя раскрасить под макет.

    Apple даёт только обычную или приглушённую схему, фильтр мест, пробки и здания. Своих цветов нет, шрифт и подписи — Apple, язык подписей берётся из настроек телефона, а логотип Apple и ссылка «Правовая информация» обязаны быть видны. Карта перестанет совпадать с макетом и с Android.

  2. Отрисовка — не узкое место.

    Наша карта на iPhone уже работает на графике Apple (Metal) и выдаёт до 120 кадров в секунду (MapLibre 6.31). Честных сравнений, где карта Apple рисует быстрее, я не нашёл.

  3. Медленно из-за сети.

    Плитки, шрифты и значки нашей карты идут через Cloudflare, а его в России обрезают. Карты Apple грузятся со своих серверов, поэтому и кажутся быстрее. Такой же выигрыш даст копия нашей карты на российском сервере, причём и на iPhone, и на Android, без изменения вида.

  4. Переход дорогой.

    60–90 часов работы плюс проверка, и дальше придётся поддерживать два разных движка карт: Android остаётся на нашей карте.

Карты AppleНаша карта сейчасНаша карта ускоренная
Совпадает с макетомНет: только обычная или приглушённая схемаДа, раскрашена под макетДа, пиксели те же
iPhone и Android одинаковыНетПочти одинаковыОдинаковы
Подписи на русскомКак язык телефонаВсегда на русскомВсегда на русском
ОтрисовкаГрафика Apple, 120 кадровMetal, 120 кадровТо же, меньше работы в главном потоке
Загрузка в РоссииСвои серверы AppleЧерез Cloudflare, который режут; раз в неделю сохранённая карта сбрасываетсяРоссийский сервер, шрифты и значки внутри приложения
Данные по РоссииИсточники Apple не раскрываетOpenStreetMap, плотно по МосквеТо же
Цена и правилаБесплатно, но Apple вправе отозвать доступБесплатноПлюс небольшой сервер в России
Работа60–90 ч + проверка—Главное — 2–2,5 дня, всё — 4–6 дней

Как проверим, что стало быстрее

Замеряю до и после каждой правки на одних и тех же сценариях. Цифры покажу в таблице.

Главные источники

Разбор кода — ветка feature/ios-cmp на 25.09.2026; размеры ответов, плиток и обложек измерены на стенде dusha и у OpenFreeMap. Переходы в прототипе — из файла Figma проекта (страница «Прототип»).