Comment Disney+ Hotstar a augmenté le nombre de vues hebdomadaires de fiches de 100% sur les appareils de salon en réduisant l'INP de 61%

L'amélioration de l'interaction jusqu'à la prochaine peinture (INP) sur les smart TV et les box présente des défis bien plus importants que pour les navigateurs pour ordinateur, en raison des contraintes liées à la prise en charge limitée des API et aux spécifications système modestes. Dans cette étude de cas, vous découvrirez comment Disney+ Hotstar a surmonté ces obstacles et en a tiré des avantages commerciaux importants.

Bhuvaneswaran Mohan
Bhuvaneswaran Mohan
Saurabh Rajpal
Saurabh Rajpal

Avec l'adoption croissante des appareils de salon, Disney+ Hotstar a compris qu'il était essentiel de proposer une expérience de navigation fluide dans son application pour les téléviseurs connectés et les box TV. Cependant, il est plus difficile de corriger l'INP pour ces appareils, car un modèle de téléviseur donné peut utiliser de très anciennes versions de navigateur. Par exemple, une téléviseur LG 2020 utilise Chrome 68, sorti en 2018. Certains de ces appareils peuvent également être classés comme appareils bas de gamme, ce qui signifie qu'ils ne peuvent pas répondre aux interactions aussi rapidement que les tablettes et ordinateurs portables haut de gamme.

Le graphique suivant compare le temps de chargement d'une page entre un ordinateur portable dont le processeur a été ralenti six fois dans les outils pour les développeurs Chrome et une smart TV. Comme vous pouvez le constater, l'ordinateur portable est toujours beaucoup plus rapide qu'une smart TV fabriquée récemment.

Capture d'écran du profileur de performances dans Chrome DevTools qui analyse les performances de chargement de l'application Disney+ Hotstar sur un ordinateur portable. Une métrique personnalisée nommée PAGE_RENDER_TIME indique 1,39 seconde.
Profil (temps de rendu de la page de 1,3 s) d'un ordinateur portable avec un ralentissement du processeur de 6 fois pour simuler la configuration du navigateur TV. PAGE_RENDER_TIME est une métrique personnalisée utilisée pour mesurer le temps écoulé entre l'affichage du premier composant de la page et la fin de l'analyse HTML.
Capture d'écran du profileur de performances dans Chrome DevTools qui analyse les performances de chargement de l'application Disney+ HotStar sur un appareil Smart TV Une métrique personnalisée appelée PAGE_RENDER_TIME indique 6,47 secondes.
Profile (6.47 second page render) from an actual TV using remote debugging with TV app running in Chrome.

Alors que ces tests génèrent des données de laboratoire, Disney+ Hotstar a commencé à collecter des données sur le terrain pour l'interaction jusqu'au prochain rendu des utilisateurs réels de son application à l'aide de la bibliothèque Web Vitals. L'entreprise a constaté que 75% des utilisateurs de l'application ont enregistré un INP de 675 millisecondes sur le terrain, ce qui est considéré comme une expérience utilisateur "médiocre" selon les seuils d'INP.

Cette étude de cas explique comment Disney+ Hotstar a amélioré la réactivité de ses applications de streaming, en particulier sur les appareils bas de gamme. Il a obtenu une amélioration de 61% en réduisant les valeurs INP à 272 millisecondes, ce qui reste supérieur au seuil recommandé de 200 millisecondes, mais constitue une amélioration substantielle.

Les résultats

Disney+ Hotstar a instrumenté l'application à l'aide de la méthode onINP de la compilation d'attribution de la bibliothèque Web Vitals. Au cours de la phase initiale, divers défis ont été rencontrés, en particulier pour identifier l'élément cible précis. Le problème est survenu, car toutes les références pointaient vers le corps en raison d'une bibliothèque de navigation spatiale tierce utilisée avec certaines personnalisations dans l'application Disney+ Hotstar. Cette bibliothèque n'écoute que les événements dans le corps du document, puis détermine l'élément sélectionné et prédit le prochain élément sélectionné en fonction des pressions sur les touches à distance.

Disney+ Hotstar a commencé par résoudre le problème d'attribution afin que les interactions responsables des valeurs d'INP élevées puissent être correctement identifiées. Pour ce faire, Disney+ Hotstar a enregistré l'attribut focusKey, qui est déjà présent dans la bibliothèque de navigation spatiale pour l'élément actuellement sélectionné, ainsi que la carte de tous les éléments sélectionnables de la page, qui est semblable à la cible d'interaction disponible dans le build d'attribution Web Vitals.

Capture d'écran d'une liste d'éléments, en fonction de leur attribut focusKey, ainsi que de la latence d'interaction pour chacun d'eux.
Capture de focusKey, ainsi que du chemin d'accès à l'élément qui le déclenche.

Maintenant que les mesures et l'attribution appropriées sont en place, les résultats des données sur le terrain indiquent que les interactions suivantes sont les plus problématiques pour l'INP:

  1. Navigation dans un carrousel horizontal.
  2. Navigation dans le carrousel vertical.
  3. Interactions pendant le chargement initial de la page.
Capture d'écran de l'élément responsable de la navigation dans le carrousel du bac à l'aide de la touche de sélection.
Enregistrement du tableau de bord montrant la contribution à l'INP par navigation dans le carrousel du bac.

Après avoir profilé ces interactions avec le panneau des performances dans les outils pour les développeurs Chrome, nous avons constaté que la bibliothèque de navigation spatiale lisait la position de tous les éléments pouvant être sélectionnés et créait un nouvel arbre. Il s'agit d'une opération coûteuse qui déclenche un dépassement de la mise en page à chaque interaction, par exemple lorsque vous passez d'un élément à un autre.

Pour la page d'accueil, une arborescence a été générée par la bibliothèque de navigation spatiale comme suit:

Exemple d'arborescence générée par la bibliothèque de navigation spatiale. Sous la racine se trouvent les nœuds "Navbar" (Barre de navigation) et "Tray Container" (Conteneur de bac). En particulier, le nœud "Tray Container" contient trois nœuds de carte, chacun d'eux comportant de nombreux sous-nœuds qui contribuent à une grande taille de DOM.
Ancien arbre de navigation spatiale pour la page d'accueil.

Cela signifie que si l'application affiche 10 bacs et que chaque bac comporte sept fiches, le conteneur du bac comportera 70 éléments pouvant être sélectionnés, y compris les éléments de navigation. Il s'agit d'un nombre élevé d'éléments interactifs. Une bibliothèque de carrousels tierce a également été utilisée, qui lisait les dimensions de chaque carte lors de la navigation horizontale pour traduire le conteneur, ce qui ajoutait encore plus de latence d'interaction.

Résoudre les problèmes

Plusieurs problèmes différents ont dû être traités séparément pour résoudre les problèmes de réactivité de l'application globale.

Améliorations de la navigation dans le bac horizontal

Disney+ Hotstar a créé sa propre bibliothèque de carrousels en interne, qui ne déclenche pas de réorganisation de la mise en page en utilisant des animations composées et en lisant les dimensions une fois par plateau, plutôt qu'une fois par carte.

La navigation spatiale ne se concentre que sur la racine du carrousel. Pour une navigation horizontale plus poussée, notre carrousel personnalisé entre en jeu. Avec cette approche, Disney+ Hotstar a supprimé la dépendance de la navigation spatiale et de l'ancienne bibliothèque de carrousels qui lisait les dimensions à chaque navigation.

Voici à quoi ressemblait l'arborescence de navigation spatiale après ces optimisations.

Exemple d'arborescence optimisée générée par la bibliothèque de navigation spatiale, qui est considérablement optimisée par rapport à la version précédente, et qui contient beaucoup moins de nœuds.
Arbre de navigation spatiale après optimisation.

Les images suivantes présentent une comparaison des performances mesurées dans le panneau "Performances" des outils pour les développeurs Chrome avant et après l'implémentation du carrousel.

Capture d'écran du panneau "Performances" dans Chrome DevTools pour les tâches lancées par le carrousel tiers. De nombreuses tâches longues retardent l'interactivité.
Carrousel tiers.
Capture d'écran du panneau "Performances" dans Chrome DevTools pour les tâches lancées par le carrousel interne. Par rapport au carrousel tiers, il y a beaucoup moins de tâches longues, ce qui permet aux interactions d'être plus rapides.
Carrousel interne.

Grâce à ce travail, Disney+ Hotstar a constaté une réduction significative de l'INP de son application sur le terrain. Il a également réussi à économiser environ 35 ko (compressés) en supprimant la bibliothèque tierce. En prime, ces améliorations ont également permis à Disney+ Hotstar de réduire la durée de sa métrique personnalisée qu'il utilise pour mesurer la durée de rendu totale de la page d'accueil, car les mises en page sont déclenchées moins souvent en raison de la réduction du nombre de nœuds de navigation spatiale.

Série temporelle de la métrique personnalisée "Temps de rendu de la page" pour tizentv et webos, qui a diminué de 31% et 25,2% respectivement entre le 13 et le 19 mars.
Tendances à la baisse des temps de rendu des pages par système d'exploitation de la TV (Samsung-Tizen et WebOS-LG).

Améliorations apportées à la navigation dans le bac vertical

Disney+ Hotstar a également amélioré les performances de navigation dans les volets verticaux en les chargeant de manière différée au lieu de les charger tous en amont. Ainsi, au chargement de la page, au lieu de charger 10 instances du bac (qui, en interne, comportent chacune un composant carrousel et un ensemble d'images), l'application ne charge que les deux bacs visibles dans le viewport, ainsi qu'un bac supplémentaire au-dessus et en dessous. Le rendu a également été divisé en plusieurs tâches à l'aide de la stratégie de rendement setTimeout() afin que le thread principal ait plus d'occasions de gérer les interactions utilisateur.

Visualisation stylisée des tâches pour exécuter des gestionnaires d'événements et mettre à jour le rendu. Les mises à jour de rendu sont reportées après une seule tâche longue.
Une seule tâche de longue durée suivie d'un rendu avant l'amélioration du bac vertical.
Autre visualisation de la même activité que la figure précédente, mais les tâches sont fractionnées en raison de la cession, ce qui permet un rendu plus rapide.
Plusieurs tâches fractionnées après l'amélioration du bac vertical, avec des possibilités de rendu entre les tâches fractionnées.

Interactions pendant le chargement initial de la page

L'INP est élevé pour les applications qui traitent un grand nombre de scripts au moment du lancement. En effet, le navigateur doit télécharger, analyser et évaluer ces scripts. Pendant tout ce processus, le thread principal sera occupé pendant une période potentiellement longue et ne pourra pas répondre rapidement aux interactions des utilisateurs.

Disney+ Hotstar a réalisé qu'il traitait plus de scripts que nécessaire au démarrage de l'application (au moment de l'écran de démarrage) pour accélérer les futures pages. Cela a entraîné des tâches d'évaluation de script supplémentaires, qui pouvaient également avoir un impact négatif sur l'INP.

Pour résoudre ce problème, Disney+ Hotstar a envisagé de charger de manière dynamique la plupart des éléments afin de gagner du temps au démarrage de l'application. Toutefois, cela aurait augmenté les temps de chargement des navigations vers les pages suivantes, car ce code JavaScript ne serait plus chargé à l'avance avec ce changement. Pour y remédier, Disney+ Hotstar a développé une bibliothèque de préchargement d'éléments en interne, qui détermine la page qui pourrait suivre dans le parcours utilisateur et précharge les éléments de cette page. Exemple :

  • Lorsqu'un utilisateur se trouve sur la page de connexion, la bibliothèque de préchargement d'assets précharge les composants de la page de sélection de profil.
  • Sur la page de sélection de profil, les composants de la page d'accueil sont chargés.
  • Sur la page d'accueil, les composants de la page d'informations sont chargés.
  • Enfin, les composants de la page de lecture sont chargés sur la page d'informations.

L'optimisation du chargement des éléments a permis à Disney+ Hotstar de réduire deux éléments: l'INP de l'application (car le thread principal était désormais relativement libre d'exécuter les interactions utilisateur) et l'utilisation de la mémoire sur les appareils de bas niveau.

Ces modifications ont entraîné une diminution de 32% du nombre d'INP indiqué dans le champ, comme illustré dans la capture d'écran suivante.

Série temporelle des valeurs de l'INP du 13 août au 11 septembre. Au cours de cette période, une diminution de 32% de l'INP est affichée.
Réduction de l'INP pour améliorer le bac.

Autres améliorations

Disney+ Hotstar a également découvert que certaines tâches longues sur certains événements utilisateur pouvaient être divisées en abandonnant souvent le thread principal. Disney+ Hotstar est allé plus loin et a créé un utilitaire de générateur de tâches qui permettra aux utilisateurs d'annuler la tâche en cours d'exécution.

Par exemple, lorsque l'utilisateur parcourt plusieurs cartes dans le bac, voici ce qui se passe:

  • La fiche suivante est sélectionnée.
  • La fiche est traduite si nécessaire.
  • Projecteur est mis à jour.
  • La bande-annonce (le cas échéant) est récupérée et la lecture est lancée.
  • Des événements Analytics sont déclenchés pour l'action.

Si, au cours de ce processus, l'utilisateur se concentre sur la fiche suivante, le reste des étapes n'a pas besoin d'être exécuté. Par exemple, la récupération de la bande-annonce et l'initialisation du lecteur pour un titre particulier ne sont plus nécessaires si l'utilisateur est passé à la fiche suivante. Par conséquent, ces tâches peuvent être interrompues pour libérer le thread principal.

L'utilitaire de générateur de tâches de Disney+ Hotstar accepte une fonction qui est une tâche. Lorsqu'une autre tâche intervient, la tâche précédente est interrompue, ce qui nous évite d'exécuter des tâches inutiles et nous permet d'agir rapidement sur la tâche nécessaire.

Résultats

Globalement, l'INP de l'application Disney+ Hotstar est passé de 675 millisecondes à 272 millisecondes, ce qui représente une amélioration de près de 60%! De plus, les latences d'interaction avec le bac ont diminué, passant d'environ 400 millisecondes à environ 100 millisecondes.

Série temporelle des valeurs de l'INP du 23 août au 21 septembre. Une réduction de 61% de l'INP a été enregistrée au cours de cette période.

Impact sur l'entreprise:le nombre de vues hebdomadaires des fiches est passé de 111 à 226 par utilisateur. Cela représente une augmentation de 100 %, ce qui montre qu'une interface plus rapide et plus réactive est plus susceptible de fidéliser les utilisateurs sur de plus longues périodes.

Capture d'écran d'une série temporelle montrant une augmentation de 100% du nombre de vues hebdomadaires des fiches dans l'application Disney+ HotStar pour Tizen TV et WebOS. L'augmentation est très forte après le 4 avril 2004.

Disney+ Hotstar n'en est qu'à ses débuts. L'entreprise n'a fait qu'effleurer l'amélioration des performances de rendu et d'interaction en se basant sur la métrique INP. Son équipe est impatiente de proposer une expérience Disney+ Hotstar fluide et agréable à ses clients dans un avenir proche.

Merci à Ayush, Ajay, Kiran, Milan et Richa de Disney+ Hotstar pour leurs efforts pour inverser la tendance.

Remerciements particuliers à Ankeet Maini, responsable de l'ingénierie Disney+ Hotstar, et à Rahul Krishnan P, responsable de l'expérience client Disney+ Hotstar, pour leur soutien dans ce travail d'innovation, ainsi qu'à Jeremy Wagner, Gilberto, Barry Pollard et Brendan Kenny de Google pour avoir relu et aidé à publier cette étude de cas.