Дмитрий Ястребков
ведущий программист
Скорость работы мобильных приложений
Фич в 2ГИС выходит много — о них весь Доставили. С каждой новой, особенно объёмной, приложение «пухнет». Наша задача — как минимум не ухудшить работу приложения, а в идеале ещё и улучшить и сделать быстрее. Расскажу, что делаем для того, чтобы пользоваться приложениями было приятнее.
В январском Доставили мы уже описывали основные улучшения, которые позволили заметно улучшить скорость мобильных приложений для Android и iOS. Зимние наблюдения закончились версией 6.15 и готовящейся тогда 6.16, в которых мы сделали упор на старт приложения, показ дашборда и поисковой выдачи, работу с потоками и загрузку данных по сети.

Тогда мы зафиксировали, что люди действительно заметили результаты той работы — число обращений на тормоза в приложении сильно снизилось. А с начала 2023 года мы стали у́же классифицировать обратную связь, чтобы точнее понимать причины недовольства.
Осенью 2023-го обращений опять стало больше. В заключении объясним, почему так вышло
Нам казалось, что в прошлом году мы уже сделали все очевидные оптимизации. Релиз 6.16 был последним, в который мы доставили много оптимизаций. А дальше началась долгая работа и эксперименты во всех командах. В этот раз решили пробовать большие и сложные изменения в архитектуре и форматах, предварительно доказывая на прототипах их потенциальную ценность.
Синхронизация хранилищ
Мы значительно переработали механизм доставки и хранения рекламных и некоторых других данных в конечных приложениях.

Теперь храним и передаём данные в более эффективном формате, который требует меньших затрат оперативной памяти и значительно выигрывает в плане скорости доступа к данным.

Тут ещё есть над чем работать: пока не добились желаемой скорости поиска данных. Но уже локализовали проблему и в скором времени её исправим.
Сетевой кэш
С конца июня начали исследовать и оптимизировать сетевой кэш — это временные файлы, которые создаёт приложение во время работы.

По результатам исследования статистики уменьшили максимальный размер кэша на треть. По метрикам увидели положительную реакцию приложения: старт у пользователей ещё немного ускорился.

Дальше поработали над эффективностью кэша: исправили баги, которые приводили к замусориванию и вытеснению из кэша реально полезных данных. Ещё переконфигурировали сервисы, которым кэш не нужен, чтобы ходили напрямую в сеть. Сейчас продолжаем работы по оптимизациям кэша, чтобы быстрее отдавать ответы и не нагружать приложение.
Карта
Рассмотрели более современные графические API, чем OpenGL: Vulkan и Metal. Про Metal в прошлом году писали статью на Хабре. Эти API позволяют эффективнее использовать устройство для отрисовки кадров.

Первый шаг — поддержать новые API так, чтобы картинка совпадала с эталоном — OpenGL. И это мы сделали. Но движок за долгие годы был приспособлен к работе именно с OpenGL, поэтому сейчас начали адаптировать движок к новым API, чтобы начать получать от них профит.
Потребление памяти
Ещё с первых версий мобильного 2ГИС все пакеты офлайн-данных отображались в оперативную память для ускорения работы с ними. С тех пор объём данных сильно вырос, а приложение в бесшовном режиме стало одновременно обращаться к данным нескольких регионов. На 32-битных Android и старых версиях iOS это могло приводить к падениям приложения при очередных попытках выделить большой кусок памяти.

Мы изменили подход к работе с данными и смогли сэкономить примерно 20% виртуальной памяти. По результатам этой и других оптимизаций падения от нехватки памяти прекратились.
Что сделали для Android
Провели много исследований и экспериментов в изменении архитектуры запуска приложения.

Основной упор сделали на новую логику запуска. Раньше интерфейс собирался в QML — это язык разметки, который отвечает за интерфейс во фреймворке Qt, которым мы пользуемся. Теперь значительная часть собирается в ядре на C++, и эта интеграция дала дополнительные возможности для контроля и тонкой настройки того, что мы загружаем на запуске. Минимизировали количество загружаемых элементов на старте, что-то теперь создаём по мере необходимости, что-то перенесли на совсем позже, а от чего-то и вовсе отказались.

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

Ещё уменьшили время отклика на обработку события смахивания, что позволило раньше начать движение списка на экране. Также актуализировали параметры скорости скролла. Для этого подготовили специальную версию 2ГИС для тюнинга параметров в реальном времени без перезапуска приложения.
А что для iOS
Как и в начале года, платформа была в лучшем состоянии. Но и тут было чем заняться: улучшили отзывчивость приложения сразу после старта, а сам старт приложения разгрузили от работы, которую можно начать делать чуть позже. Это тоже должно ускорять запуск.
Это и два следующих видео сняты на версиях 2ГИС 6.15 и 6.27 на iPhone SE iOS 15
Поработали над уменьшением фризов при подгрузке новых страниц выдачи — это очень актуально для старых устройств. В итоге на скачанном городе почти во всех сценариях уменьшили время открытия выдачи и применение фильтров.
В онлайн-режиме также есть улучшения, хотя и менее заметные. Подгрузка следующих 20 элементов выдачи стала более плавной.
Инструменты
Пока внедряли улучшения, занимались и инструментами для анализа производительности, чтобы разработчикам было проще ими пользоваться. Стали регулярно собирать и накапливать статистику по метрикам времени выполнения критических частей кода.

В дальнейшем хотим построить из отдельных элементов систему, которая поможет не допускать деградации скорости в будущем.
Метрики
В течение долгого периода 2023-го приложения для Android нет в Google Play, а до апреля iOS-приложение было заблокировано и в App Store. Это создаёт сложности для анализа метрик старта приложения: аудитория большая, она меняется и покупает новые мощные устройства, а 2ГИС при этом труднее обновлять.

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

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

Ниже самый показательный график — изменение распределения аудитории по времени запуска приложения.
По итогам октября больше 70% устройств запускают 2ГИС быстрее, чем за 4 секунды
Что дальше
Продолжим следить за метриками и обратной связью. Осенние обращения в саппорт говорят о том, что новые потенциальные проблемы могут быть связаны со скоростью работы карты и Новой транспортной выдачей, которая вышла летом. Мы уже предпринимаем прикладные шаги, чтобы ускорить эти сценарии. А на подходе ещё один большой релиз (пока очень секретный), так что готовимся и к нему, чтобы приложение работало быстро, и люди это заметили.
Нажимая кнопку «Комментировать», вы принимаете условия Лицензионного соглашения и даёте ООО «ДубльГИС» согласие на обработку персональных данных на условиях и в целях, определённых «Политикой конфиденциальности».