Как Disney+ Hotstar увеличила количество просмотров карточек в неделю на 100 % на устройствах в гостиной, снизив INP на 61 %

Улучшение взаимодействия с Next Paint (INP) на смарт-телевизорах и телевизионных приставках представляет значительно больше проблем, чем для настольных браузеров, из-за ограничений ограниченной поддержки API и скромных системных характеристик. Из этого примера вы узнаете, как Disney+ Hotstar успешно преодолела эти препятствия и в результате получила значительные преимущества для бизнеса.

Бхуванесваран Мохан
Bhuvaneswaran Mohan
Саураб Раджпал
Saurabh Rajpal

С ростом популярности устройств в гостиной компания Disney+ Hotstar осознала, что обеспечение беспрепятственного просмотра контента в их приложении для смарт-телевизоров и телеприставок является важнейшим бизнес-требованием. Однако исправить INP для таких устройств сложнее потому, что любая конкретная модель телевизора может использовать очень старые версии браузера — например, телевизор LG 2020 года использует Chrome 68, выпущенный в 2018 году . Некоторые из этих устройств также можно отнести к категории бюджетных устройств, а это означает, что они не могут реагировать на взаимодействия так же быстро, как флагманские планшеты и ноутбуки.

На следующем рисунке сравнивается, сколько времени требуется для загрузки страницы между ноутбуком с замедленным процессором в шесть раз, примененным в Chrome DevTools, и Smart TV. Как видно, ноутбук по-прежнему намного быстрее, чем недавно выпущенный смарт-телевизор.

Снимок экрана профилировщика производительности в Chrome DevTools, профилирующего производительность загрузки приложения Disney+ HotStar на ноутбуке. Пользовательский показатель PAGE_RENDER_TIME составляет 1,39 секунды.
Профиль (время рендеринга страницы 1,3 с) с ноутбука с шестикратным замедлением ЦП для имитации конфигурации браузера телевизора. PAGE_RENDER_TIME — это настраиваемая метрика, используемая для учета времени, прошедшего между отображением первого компонента страницы и завершением анализа HTML.
Снимок экрана профилировщика производительности в Chrome DevTools, профилирующего производительность загрузки приложения Disney+ HotStar на реальном устройстве Smart TV. Пользовательский показатель PAGE_RENDER_TIME составляет 6,47 секунды.
Профиль (рендеринг страницы 6,47 секунды) с реального телевизора с использованием удаленной отладки с помощью телевизионного приложения, работающего в Chrome.

Хотя эти тесты дают лабораторные данные , Disney+ Hotstar начала собирать полевые данные для взаимодействия с следующей отрисовкой (INP) от реальных пользователей своего приложения, используя библиотеку веб-виталов, и заметила, что у 75% пользователей приложения INP составил 675 миллисекунд в поле, что считается «плохим» пользовательским опытом согласно пороговым значениям INP .

В этом тематическом исследовании показано, как Disney+ Hotstar улучшила скорость реагирования своих потоковых приложений, особенно на устройствах бюджетного класса. Они добились улучшения на 61%, снизив значения INP до 272 миллисекунд , что все еще превышает рекомендуемый «хороший» порог в 200 миллисекунд, но является существенным улучшением в этом направлении.

Находки

Disney+ Hotstar оснастила приложение, используя метод onINP из сборки атрибуции библиотеки web-vitals . На начальном этапе возникли различные проблемы, особенно при определении точного целевого элемента. Проблема возникла из-за того, что все ссылки указывали на тело из-за сторонней библиотеки пространственной навигации , которая использовалась с некоторыми настройками в приложении Disney+ Hotstar. Эта библиотека исключительно прослушивает события в теле документа, а затем определяет фактический элемент, на котором находится фокус, и прогнозирует следующий фокус на основе удаленных нажатий клавиш.

Disney+ Hotstar начала с решения проблемы атрибуции, чтобы можно было правильно идентифицировать взаимодействия, ответственные за высокие значения INP. Для этого Disney+ Hotstar зарегистрировал атрибут focusKey , который уже присутствует в библиотеке пространственной навигации для элемента, находящегося в фокусе, а также карту всех фокусируемых элементов на странице, что аналогично цели взаимодействия, доступной в сборке атрибуции веб-показателей. .

Скриншот списка элементов в соответствии с их атрибутом focusKey, а также задержкой взаимодействия для каждого из них.
Захват focusKey вместе с путем к элементу, запускающему его.

Теперь, когда имеются соответствующие измерения и атрибуция, результаты полевых данных показали, что следующие взаимодействия являются наиболее проблематичными для INP:

  1. Горизонтальная карусельная навигация.
  2. Вертикальная карусельная навигация.
  3. Взаимодействия во время начальной загрузки страницы.
Скриншот элемента, отвечающего за навигацию по карусели в трее по клавише фокуса.
Запись на информационной панели, показывающая вклад в INP с помощью карусельной навигации по лоткам.

После профилирования этих взаимодействий с помощью панели производительности в Chrome Dev Tools выяснилось, что библиотека пространственной навигации считывает положение всех фокусируемых элементов и строит новое дерево. Это дорогостоящая операция, которая вызывает перестановку макета при каждом взаимодействии, например при переходе от одного элемента к другому.

Для домашней страницы дерево было создано библиотекой пространственной навигации следующим образом:

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

Это означало, что если приложение отображало 10 лотков, и в каждом лотке было 7 карточек, в контейнере лотков было бы 70 фокусируемых элементов, включая элементы навигации. Это большое количество интерактивных элементов. Также использовалась сторонняя библиотека карусели , которая считывала размеры каждой карточки во время горизонтальной навигации для перевода контейнера, увеличивая задержку взаимодействия.

Устранение проблем

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

Улучшения навигации по горизонтальным лоткам

Disney+ Hotstar создала собственную библиотеку каруселей, которая не приводит к изменению макета за счет использования составной анимации и считывания размеров один раз для каждого лотка, а не один раз для каждой карты.

Пространственная навигация фокусируется только на корне карусели, а для дальнейшей горизонтальной навигации на сцену выходит наша пользовательская карусель. Благодаря этому подходу Disney+ Hotstar устранила зависимость пространственной навигации и старой библиотеки каруселей, которая считывала размеры при каждой навигации.

Вот как выглядело дерево пространственной навигации после этих оптимизаций.

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

Следующие изображения представляют собой сравнение производительности, измеренной на панели производительности Chrome DevTools до и после реализации нашей карусели.

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

В результате этой работы Disney+ Hotstar добилась значительного снижения INP своего приложения в этой области. Им также удалось сэкономить около 35 КБ (в сжатом виде), удалив стороннюю библиотеку. В качестве бонуса эти улучшения также позволили Disney+ Hotstar сократить продолжительность своей пользовательской метрики, которую они используют для измерения общего времени рендеринга домашней страницы, поскольку макеты запускаются реже из-за уменьшения количества узлов пространственной навигации.

Временной ряд пользовательской метрики времени рендеринга страницы для tizentv и webos, которая снизилась на 31% и 25,2% соответственно, начиная с периода с 13 по 19 марта.
Тенденция к снижению времени рендеринга страниц для ОС ТВ (Samsung-Tizen и WebOS-LG).

Улучшения навигации по вертикальному лотку

Disney+ Hotstar также улучшила производительность навигации по вертикальным лоткам за счет ленивой загрузки лотков вместо того, чтобы загружать их все заранее. Таким образом, при загрузке страницы вместо загрузки 10 экземпляров лотка, каждый из которых внутри имеет компонент карусели и кучу изображений, приложение загружает только два лотка, которые видны в области просмотра, а также дополнительный лоток сверху и снизу. Рендеринг также был разделен на несколько задач с использованием стратегии получения результатов setTimeout() , чтобы у основного потока было больше возможностей для обработки взаимодействия с пользователем.

Стилизованная визуализация задач по запуску обработчиков событий и отрисовке обновлений. Обновления рендеринга откладываются после одной длительной задачи.
Одна длительная задача, за которой следует рендеринг перед улучшением вертикального лотка.
Еще одна визуализация того же действия, что и на предыдущем рисунке, но задачи разбиты из-за уступки, что позволяет выполнить рендеринг раньше.
Несколько разделенных задач после улучшения вертикального лотка с возможностью рендеринга между разделенными задачами.

Взаимодействия во время начальной загрузки страницы

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

В Disney+ Hotstar поняли, что во время запуска приложения (время заставки) они обрабатывают больше сценариев, чем было на самом деле необходимо, чтобы ускорить загрузку будущих страниц. Это потребовало дополнительных задач по оценке сценария, что также могло негативно повлиять на INP.

Чтобы исправить это, Disney+ Hotstar рассмотрела возможность динамической загрузки большинства ресурсов, чтобы они экономили время при запуске приложения. Однако это привело бы к увеличению времени загрузки переходов на будущие страницы, поскольку после этого изменения JavaScript больше не будет загружаться заранее. Чтобы решить эту проблему, Disney+ Hotstar разработала собственную библиотеку предварительной загрузки ресурсов, которая определяет, какая страница может быть следующей на пути пользователя, и предварительно загружает ресурсы для этой страницы. Например:

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

Оптимизация загрузки ресурсов помогла Disney+ Hotstar добиться двух целей: уменьшить INP приложения (поскольку основной поток теперь был относительно свободен для выполнения действий пользователя), а также сократить использование памяти на устройствах низкого уровня.

Эти изменения привели к уменьшению на 32% количества зарегистрированных INP с мест, как можно видеть на следующем снимке экрана.

Временной ряд значений INP, начиная с 13 августа и 11 сентября. За этот период показано снижение INP на 32%.
Снижение INP для улучшения лотка.

Другие улучшения

Disney+ Hotstar также выяснила, что в нескольких пользовательских событиях есть длинные задачи, которые можно разделить , часто уступая основному потоку , и пошла еще дальше и создала утилиту генератора задач, которая позволит пользователям отменить задачу в середине ее выполнения. исполнение.

Например, когда пользователь перемещается по нескольким карточкам на лотке, происходит следующее:

  • Следующая карта сфокусирована.
  • Карта переводится, если это необходимо.
  • Прожектор обновлен.
  • Трейлер (если он есть) загружается и начинается воспроизведение.
  • События аналитики запускаются для действия.

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

Утилита генератора задач Disney+ Hotstar принимает функцию, которая является задачей, и когда в середине появляется другая задача, предыдущая задача прерывается, что позволяет нам не выполнять ненужную задачу и быстро действовать по необходимой задаче.

Полученные результаты

В целом INP приложения Disney+ Hotstar снизился с 675 миллисекунд до 272 миллисекунд , что представляет собой улучшение почти на 60 %! Кроме того, задержка взаимодействия с лотком, в частности, снизилась примерно с 400 миллисекунд до примерно 100 миллисекунд.

Временной ряд значений INP с 23 августа по 21 сентября. За этот период было достигнуто снижение INP на 61%.

Эффект для бизнеса: количество просмотров карточек в неделю увеличилось со 111 до 226 на пользователя! Это увеличение на 100 %, демонстрирующее, что более быстрый и отзывчивый интерфейс с большей вероятностью будет привлекать пользователей в течение более длительных периодов времени.

Скриншот временного ряда, показывающий 100-процентное увеличение числа просмотров карточек за неделю в приложении Disney+ HotStar как для tizentv, так и для webos. Увеличение происходит очень резко после 4 апреля 2004 года.

Это только начало, и Disney+ Hotstar только прикоснулся к поверхности улучшения производительности рендеринга и взаимодействия, используя в качестве ориентира метрику INP. И их команда рада сделать Disney+ Hotstar приятным опытом для своих клиентов в ближайшем будущем.

Спасибо Аюшу, Аджаю, Киран, Милану и Риче из Disney+ Hotstar за их усилия переломить ситуацию.

Особая благодарность Анкиту Майни , инженерному руководителю Disney+ Hotstar, и Рахулу Кришнану П , руководителю отдела клиентского опыта Disney+ Hotstar, за поддержку этой инновационной работы, а также Джереми Вагнеру, Жилберто, Барри Полларду и Брендану Кенни из Google за рецензирование и помощь в публикации. тематическое исследование.