Jak Disney+ Hotstar zwiększył tygodniową liczbę wyświetleń kart o 100% na urządzeniach domowych, obniżając INP o 61%

Poprawa czasu od interakcji do kolejnego wyrenderowania (INP) na telewizorach smart TV i urządzeniach set-top box wiąże się z większymi wyzwaniami niż w przypadku przeglądarek na komputery, ze względu na ograniczenia związane z ograniczonym wsparciem interfejsu API i skromnymi specyfikacjami systemowymi. Z tego studium przypadku dowiesz się, jak Disney+ Hotstar skutecznie pokonał te przeszkody i w efekcie osiągnął znaczące korzyści biznesowe.

Bhuvaneswaran Mohan
Bhuvaneswaran Mohan
Saurabh Rajpal
Saurabh Rajpal

W związku z rosnącym zainteresowaniem urządzeniami do użytku domowego Disney+ Hotstar uznał, że bezproblemowe przeglądanie w aplikacji na telewizory i dekodery jest kluczowym wymogiem biznesowym. Utrudnia to naprawianie INP na takich urządzeniach, ponieważ każdy model telewizora może używać bardzo starych wersji przeglądarki. Na przykład telewizor LG z 2020 r. korzysta z Chrome 68 wydanej w 2018 r. Niektóre z nich mogą być też zaliczane do urządzeń niskiej klasy, co oznacza, że nie reagują na interakcje tak szybko jak flagowe tablety i laptopy.

Na poniższym rysunku porównano czas wczytywania strony na laptopie z procesorem spowolnionym 6-krotnie w Narzędziach deweloperskich w Chrome i na telewizorze smart TV. Jak widać, laptop jest nadal znacznie szybszy niż niedawno wyprodukowany telewizor smart TV.

Zrzut ekranu przedstawiający narzędzie do profilowania wydajności w Narzędziach deweloperskich w Chrome, które profiluje wydajność wczytywania aplikacji Disney+ HotStar na laptopie. Dane niestandardowe o nazwie PAGE_RENDER_TIME wynoszą 1,39 sekundy.
Profil (czas renderowania strony 1,3 s) z laptopa z 6-krotnie wolniejszym procesorem, aby symulować konfigurację przeglądarki na telewizorze. PAGE_RENDER_TIME to dane niestandardowe służące do rejestrowania czasu między wyświetleniem pierwszego elementu strony a zakończeniem analizowania kodu HTML.
Zrzut ekranu przedstawiający narzędzie do profilowania wydajności w Narzędziach dla programistów w Chrome, które profiluje wydajność ładowania aplikacji Disney+ HotStar na urządzeniu Smart TV. Dane niestandardowe o nazwie PAGE_RENDER_TIME wynoszą 6,47 s.
Profil (renderowanie strony w czasie 6,47 s) z rzeczywistego telewizora przy użyciu debugowania zdalnego z aplikacją TV w Chrome.

Te testy dostarczają danych z laboratorium, ale Disney+ Hotstar zaczął też zbierać dane z pola dotyczące czasu od interakcji do wyświetlenia treści (INP) od rzeczywistych użytkowników aplikacji za pomocą biblioteki web-vitals. Okazało się, że 75% użytkowników aplikacji miało czas INP wynoszący 675 ms, co według progresji INP jest uważane za „słabe” wrażenia użytkownika.

To studium przypadku pokazuje, jak Disney+ Hotstar poprawił szybkość działania swoich aplikacji do strumieniowego przesyłania danych, zwłaszcza na mniej zaawansowanych urządzeniach. Uzyskali 61% poprawy, zmniejszając wartość INP do 272 milisekund. Nadal jest to wartość powyżej zalecanego progu 200 milisekund, ale jest to znaczna poprawa.

Wyniki

Disney+ Hotstar zinstrumentował aplikację za pomocą metody onINP z wersji atrybucji biblioteki web-vitals. W pierwszej fazie napotykaliśmy różne problemy, zwłaszcza związane z określaniem dokładnego elementu docelowego. Problem powstał, ponieważ wszystkie odwołania wskazywały na treść ze względu na bibliotekę nawigacji przestrzennej innej firmy, która została użyta z niektórymi dostosowaniami w aplikacji Disney+ Hotstar. Ta biblioteka nasłuchuje tylko zdarzeń w ciele dokumentu, a następnie określa rzeczywisty element skupienia i przewiduje następne skupienie na podstawie naciśnięć przycisków na pilocie.

Disney+ Hotstar zaczął od rozwiązania problemu atrybucji, aby prawidłowo identyfikować interakcje odpowiedzialne za wysokie wartości INP. W tym celu Disney+ Hotstar zarejestrował atrybut focusKey, który jest już obecny w bibliotece nawigacji przestrzennej dla aktualnie skupionego elementu, a także mapę wszystkich elementów, na których można skupić uwagę na stronie, która jest analogiczna do celu interakcji dostępnego w wersji atrybucji web-vitals.

Zrzut ekranu z listą elementów według atrybutu focusKey wraz z czasem oczekiwania na interakcję w przypadku każdego z nich.
Przechwytywanie wartości focusKey wraz ze ścieżką do elementu, który ją wywołał.

Teraz, gdy mamy już odpowiednie pomiary i atrybucję, dane z polowych kampanii wskazują, że te interakcje są najbardziej problematyczne dla INP:

  1. Nawigacja w poziomie w karuzelce.
  2. Nawigacja w poziomym menu karuzeli.
  3. Interakcje podczas wstępnego wczytywania strony.
Zrzut ekranu elementu odpowiedzialnego za nawigację w karuzeli na pasku za pomocą klawisza fokusu
Wpis w panelu przedstawiający udział w INP na podstawie nawigacji w karuzeli.

Po przeprowadzeniu profilowania tych interakcji za pomocą panelu wydajności w Narzędziach dla deweloperów Chrome okazało się, że biblioteka nawigacji przestrzennej odczytuje pozycję wszystkich elementów, na których można ustawić fokus, i utworzy nowe drzewo. Jest to kosztowna operacja, która powoduje zmianę układu przy każdej interakcji, np. podczas przechodzenia od jednego elementu do drugiego.

W przypadku strony głównej biblioteka nawigacji przestrzennej wygenerowała drzewo w ten sposób:

Przykład drzewa wygenerowanego przez bibliotekę nawigacji przestrzennej. Pod węzłem głównym znajdują się węzły paska nawigacyjnego i kontenera zasobnika. W szczególności węzeł elementu kontrolnego zawiera 3 węzły karty, z których każdy ma liczne podwęzły, co powoduje duży rozmiar DOM.
Wcześniejsze drzewo nawigacji przestrzennej na stronie głównej.

Oznacza to, że jeśli aplikacja wyświetla 10 pojemników, a każdy z nich zawiera 7 kart, to w pojemniku będzie 70 elementów, na których można się skupić, w tym elementy nawigacyjne. To duża liczba elementów interaktywnych. Użyliśmy też biblioteki karuzeli innej firmy, która odczytuje wymiary każdej karty podczas nawigacji poziomej, aby przetłumaczyć kontener, co jeszcze bardziej wydłuży czas oczekiwania na interakcję.

Rozwiązywanie problemów

Aby rozwiązać problemy z szybkością działania całej aplikacji, trzeba było rozwiązać kilka różnych problemów.

Ulepszenia nawigacji w poziomym zasobniku

Disney+ Hotstar stworzył własną bibliotekę karuzeli, która nie powoduje częstych zmian układu, ponieważ używa animacji złożonych i odczytuje wymiary raz na każdą tacę, a nie raz na każdą kartę.

Nawigacja przestrzenna skupia się tylko na korzeniach karuzeli, a do dalszej nawigacji poziomej służy nasza niestandardowa karuzela. Dzięki temu podejściu Disney+ Hotstar usunął zależność od nawigacji przestrzennej i starej biblioteki karuzeli, która odczytywała wymiary w każdej nawigacji.

Oto jak wyglądało drzewo nawigacji przestrzennej po tych optymalizacjach.

Przykład zoptymalizowanego drzewa wygenerowanego przez bibliotekę nawigacji przestrzennej, które jest znacznie bardziej zoptymalizowane niż poprzednia wersja i zawiera znacznie mniej węzłów.
Drzewo nawigacji przestrzennej po optymalizacji.

Na poniższych obrazach widać porównanie skuteczności mierzonej w panelu skuteczności w Narzędziach deweloperskich w Chrome przed i po implementacji karuzeli.

Zrzut ekranu przedstawiający panel wydajności w Narzędziach deweloperskich w Chrome, w którym widoczne są zadania uruchamiane przez karuzele innych firm. Widać wiele długich zadań, które opóźniają interaktywność.
Karuzela zewnętrzna.
Zrzut ekranu przedstawiający panel wydajności w Narzędziach dla programistów w Chrome w przypadku zadań uruchamianych przez karuzelę wewnętrzną. W porównaniu z karuzelą zewnętrzną jest znacznie mniej długich zadań, co pozwala na szybsze interakcje.
Karuzela z własnymi treściami.

W rezultacie tych działań Disney+ Hotstar odnotował znaczne zmniejszenie INP aplikacji w tym obszarze. Dzięki usunięciu biblioteki zewnętrznej udało im się też zaoszczędzić około 35 KB (skompresowane). Dodatkowo te ulepszenia pozwoliły Disney+ Hotstar skrócić czas trwania danych niestandardowych, których firma używa do pomiaru łącznego czasu renderowania strony głównej, ponieważ układy są uruchamiane rzadziej ze względu na zmniejszenie liczby węzłów nawigacji przestrzennej.

Dane seryjne z danymi niestandardowymi dotyczącymi czasu renderowania strony w przypadku platform TizenTV i WebOS, które spadły odpowiednio o 31% i 25,2% w okresie od 13 do 19 marca.
Spadek czasu renderowania stron według systemu operacyjnego telewizora (Tizen firmy Samsung i WebOS firmy LG).

Ulepszenia nawigacji w menu bocznym

Disney+ Hotstar poprawił też wydajność nawigacji w pionie, stosując ładowanie opóźnione zamiast ładowania wszystkich elementów z góry. Dlatego podczas wczytywania strony zamiast wczytywać 10 kopii tacy, z których każda ma wewnętrznie komponent karuzeli i kilka obrazów, aplikacja wczytuje tylko 2 tacę widoczne w widoku portu oraz dodatkową tacę u góry i u dołu. Renderowanie zostało podzielone na wiele zadań za pomocą strategii wydajności setTimeout(), aby wątek główny miał więcej możliwości obsługi interakcji z użytkownikiem.

Stylizowana wizualizacja zadań związanych z uruchamianiem modułów obsługi zdarzeń i renderowaniem aktualizacji. Aktualizacje renderowania są odkładane po jednym długim zadaniu.
Jedno długie zadanie, po którym następuje renderowanie przed ulepszeniem poziomego menu.
Kolejna wizualizacja tej samej aktywności co na poprzednim rysunku, ale zadania są podzielone ze względu na yielding, co pozwala na szybsze renderowanie.
Ulepszenia dotyczące wielu podzielonych zadań po wprowadzeniu ulepszeń w poziomiejnym panelu, z możliwością renderowania między podzielonymi zadaniami.

Interakcje podczas początkowego wczytywania strony

W przypadku aplikacji, które podczas uruchamiania przetwarzają ogromną liczbę skryptów, INP będzie wysoki. Wynika to z tego, że przeglądarka musi pobrać, przeanalizować i przetworzyć te skrypty. Podczas tego wszystkiego wątek główny może być zajęty przez długi czas i nie może szybko reagować na interakcje użytkownika.

Disney+ Hotstar dostrzegł, że podczas uruchamiania aplikacji (czas ekranu powitalnego) przetwarza więcej skryptów niż było to konieczne, aby przyspieszyć wczytywanie kolejnych stron. Wymagało to wykonania dodatkowych zadań związanych z weryfikacją skryptu, które również mogły negatywnie wpłynąć na INP.

Aby rozwiązać ten problem, Disney+ Hotstar rozważał dynamiczne wczytywanie większości komponentów, aby zaoszczędzić czas podczas uruchamiania aplikacji. Jednak spowodowałoby to wydłużenie czasu wczytywania stron, do których użytkownicy będą przechodzić w przyszłości, ponieważ kod JavaScript nie będzie już wczytywany z wyprzedzeniem. Aby rozwiązać ten problem, firma Disney+ Hotstar opracowała własną bibliotekę wstępnego ładowania zasobów, która określa, która strona może pojawić się jako następna w trakcie podróży użytkownika, i wstępnie ładuje zasoby tej strony. Na przykład:

  • Gdy użytkownik wejdzie na stronę logowania, biblioteka wstępnego ładowania zasobów przeładuje zasoby na potrzeby strony wyboru profilu.
  • Na stronie wyboru profilu wczytywane są komponenty strony głównej.
  • Na stronie głównej wczytują się zasoby strony z informacjami.
  • Na koniec na stronie z informacjami wczytywane są zasoby strony odtwarzania.

Optymalizacja ładowania zasobów pomogła Disney+ Hotstar w 2 sposobach: zmniejszyła INP aplikacji (ponieważ główny wątek był teraz stosunkowo wolny do wykonywania interakcji z użytkownikiem) oraz zmniejszyła wykorzystanie pamięci na urządzeniach niskiego poziomu.

Te zmiany spowodowały spadek o 32% liczby zgłoszonych numerów INP w tym polu, co widać na poniższym zrzucie ekranu.

Seria czasowa wartości INP od 13 sierpnia do 11 września. W tym okresie odnotowano spadek INP o 32%.
Zmniejszenie liczby INP w ramach ulepszeń dotyczących ikony w pasku menu.

Inne usprawnienia

Disney+ Hotstar odkrył też, że w przypadku kilku zdarzeń użytkownika występują długie zadania, które można podzielić, często przekazując je do głównego wątku. Usługa poszła o jeden krok dalej i utworzyła narzędzie do generowania zadań, które pozwoli użytkownikom anulować zadanie w trakcie jego wykonywania.

Jeśli na przykład użytkownik przewija karty na liście, dzieją się następujące rzeczy:

  • Następna karta jest aktywna.
  • W razie potrzeby karta jest tłumaczona.
  • Wyróżnienie zostało zaktualizowane.
  • Pobierany jest zwiastun (jeśli występuje) i inicjowane jest odtwarzanie.
  • W przypadku działania są wywoływane zdarzenia Analytics.

Jeśli w trakcie tego procesu użytkownik skupi się na następnej karcie, nie będzie musiał wykonywać pozostałych czynności. Na przykład pobieranie zwiastuna i inicjowanie odtwarzacza w przypadku danego tytułu nie będzie już potrzebne, jeśli użytkownik przejdzie do następnej karty. Dlatego te zadania można przerwać, aby zwolnić wątek główny.

Narzędzie do generowania zadań Disney+ Hotstar akceptuje funkcję, która jest zadaniem, a gdy w połowie pojawia się inne zadanie, poprzednie zadanie jest anulowane, co pozwala zaoszczędzić czas na niepotrzebne wykonywanie zadań i szybko wykonać zadanie niezbędne.

Wyniki

Ogólnie rzecz biorąc, INP aplikacji Disney+ Hotstar spadł z 675 milisekund do 272 milisekund, co oznacza o prawie 60% lepszą wydajność. Ponadto czas reakcji na interakcje z paskiem zmniejszył się z około 400 milisekund do około 100 milisekund.

Wartości INP w postaci szeregu czasowego od 23 sierpnia do 21 września. W tym czasie udało się zmniejszyć INP o 61%.

Wpływ na działalność firmy: tygodniowa liczba wyświetleń karty wzrosła z 111 na 226 na użytkownika. To wzrost o 100%, co pokazuje, że szybszy i bardziej responsywny interfejs łatwiej przyciąga uwagę użytkowników na dłuższy czas.

Zrzut ekranu z serią czasową, który pokazuje wzrost o 100% liczby tygodniowych wyświetleń kart w aplikacji Disney+ HotStar zarówno w przypadku TizenTV, jak i WebOS. Po 4 kwietnia 2004 r. wzrost nastąpił bardzo gwałtownie.

To dopiero początek. Disney+ Hotstar dopiero zaczyna wykorzystywać dane INP do poprawy wydajności renderowania i interakcji. Zespół Disney+ Hotstar z niecierpliwością czeka na możliwość zaoferowania klientom Disney+ Hotstar w najbliższej przyszłości jeszcze płynniejszego korzystania z usługi.

Dziękujemy Ayush, Ajay, Kiran, Milan i Richa z Disney+ Hotstar za ich wysiłki, które doprowadziły do rozwiązania problemu.

Specjalne podziękowania dla Ankeeta Mainiego, szefa działu inżynieryjnego w Disney+ Hotstar, i Rahula Krishnana P, szefa działu obsługi klienta w Disney+ Hotstar, za wsparcie w tym zakresie innowacji oraz dla Jeremy’ego Wagnera, Gilberto, Barry’ego Pollarda i Brendana Kenny’ego z Google za sprawdzenie i pomoc w publikowaniu tego przypadku.