איך Disney+ Hotstar הגדילה את מספר הצפיות בכרטיסים השבועיים ב-100% במכשירים בסלון והפחיתה את ה-INP ב-61%

שיפור מהירות התגובה לאינטראקציה באתר (INP) בטלוויזיות חכמות ובמכשירי ממיר דיגיטלי (STB) הוא אתגר גדול יותר מאשר בדפדפנים למחשב, בגלל המגבלות של תמיכה מוגבלת ב-API ומפרטי מערכת צנועים. במקרה לדוגמה הזה נסביר איך Disney+ Hotstar הצליחה להתגבר על המכשולים האלה, וכתוצאה מכך נהנתה מהטבות עסקיות משמעותיות.

Bhuvaneswaran Mohan
Bhuvaneswaran Mohan
Saurabh Rajpal
Saurabh Rajpal

בעקבות העלייה בשימוש במכשירים בסלון, ב-Disney+ Hotstar הבינו שחשוב מאוד לספק חוויית גלישה חלקה באפליקציה שלהם לטלוויזיות חכמות ולקופסאות סטרימינג. עם זאת, קשה יותר לתקן את INP במכשירים כאלה כי בכל דגם טלוויזיה נתון עשויות לפעול גרסאות דפדפן ישנות מאוד. לדוגמה, ב-LG TV מ-2020 פועלת גרסה 68 של Chrome שיצאה בשנת 2018. חלק מהמכשירים האלה יכולים להיכלל גם בקטגוריה של מכשירים ברמה נמוכה, כלומר הם לא יכולים להגיב לאינטראקציות במהירות כמו טאבלטים ומחשבים ניידים מובילים.

בתרשים הבא מוצגת השוואה בין משך הזמן הנדרש לטעינה של דף במחשב נייד שבו מעבד ה-CPU הושבת פי שישה באמצעות כלי הפיתוח ל-Chrome, לבין טלוויזיה חכמה. כפי שניתן לראות, המחשב הנייד עדיין מהיר בהרבה מטלוויזיה חכמה שיוצרו לאחרונה.

צילום מסך של פרופיל הביצועים בכלי הפיתוח ל-Chrome, שבו מוצג פרופיל הביצועים של טעינת אפליקציית Disney+ HotStar במחשב נייד. המדד המותאם אישית PAGE_RENDER_TIME מגיע ל-1.39 שניות.
פרופיל (זמן עיבוד דף של 1.3 שניות) מהמחשב הנייד עם האטה של 6x במעבד, כדי לדמות הגדרת דפדפן בטלוויזיה. המדד PAGE_RENDER_TIME הוא מדד מותאם אישית שמשמש לתעד את הזמן שחלף בין הצגת הרכיב הראשון בדף לבין השלמת הניתוח של ה-HTML.
צילום מסך של פרופיל הביצועים בכלי הפיתוח ל-Chrome, שבו מוצג פרופיל של ביצועי הטעינה של אפליקציית Disney+ HotStar במכשיר Smart TV בפועל. המדד המותאם אישית PAGE_RENDER_TIME מגיע ל-6.47 שניות.
פרופיל (עיבוד דף של 6.47 שניות) מטלוויזיה בפועל באמצעות ניפוי באגים מרחוק עם אפליקציית טלוויזיה שפועלת ב-Chrome.

הבדיקות האלה מניבות נתונים מעבדה, אבל ב-Disney+ Hotstar התחילו לאסוף נתוני שטח של אינטראקציה לציור הבא (INP) ממשתמשים אמיתיים באפליקציה באמצעות ספריית Web Vitals, וראו ש-75% ממשתמשי האפליקציה חוו INP של 675 אלפיות השנייה בשטח, שנחשב לחוויית משתמש 'חלשה' לפי ערכי הסף של INP.

בניתוח המקרה הזה נסביר איך Disney+ Hotstar שיפרה את המהירות בתגובה באפליקציות הסטרימינג שלה, במיוחד במכשירים ברמה נמוכה. הם השיגו שיפור של 61% על ידי הפחתת ערכי ה-INP ל-272 אלפיות השנייה – עדיין מעל הסף המומלץ של 200 אלפיות השנייה, אבל שיפור משמעותי בדרך לשם.

הממצאים

צוות Disney+ Hotstar הוסיף לאפליקציה את הכלי באמצעות השיטה onINP מגרסת build השיוך של ספריית web-vitals. בשלב הראשוני נתקלו באתגרים שונים, במיוחד בזיהוי רכיב היעד המדויק. הבעיה נגרמה כי כל ההפניות הצביעו על הגוף בגלל ספריית ניווט מרחבי של צד שלישי, שבה נעשה שימוש עם התאמות אישיות מסוימות באפליקציית Disney+ Hotstar. הספרייה הזו מקשיבה רק לאירועים בגוף המסמך, ולאחר מכן קובעת את הרכיב בפועל שמקבל את המיקוד ומנבאת את המיקוד הבא על סמך הקשות על מקשים מרחוק.

הצוות של Disney+ Hotstar התחיל בפתרון הבעיה בשיוך כדי שאפשר יהיה לזהות כראוי את האינטראקציות שמשפיעות על ערכי INP גבוהים. לשם כך, ב-Disney+ Hotstar רשמו ביומן את המאפיין focusKey שכבר קיים בספריית הניווט המרחבי של הרכיב שבו מופעל המיקוד כרגע, וגם מפה של כל הרכיבים בדף שאפשר להתמקד בהם. המפה הזו דומה ליעד האינטראקציה שזמין ב-build השיוך של מדדי ה-Web Vitals.

צילום מסך של רשימת אלמנטים, לפי מאפיין focusKey שלהם, יחד עם זמן האחזור של האינטראקציה בכל אחד מהם.
צילום focusKey, יחד עם הנתיב לאלמנט שמפעיל אותו.

עכשיו, כשהמדידה והשיוך מתבצעים בצורה מתאימה, הממצאים מנתוני השדה הצביעו על האינטראקציות הבאות כבעייתיות ביותר ל-INP:

  1. ניווט בערימה אופקית של קרוסלה.
  2. ניווט בחלונית הקרוסלה האנכית.
  3. אינטראקציות במהלך טעינת הדף הראשונית.
צילום מסך של הרכיב שאחראי לניווט בקרוסלה של המגש באמצעות מקש המיקוד שלו.
רשומה במרכז הבקרה שמציגה את התרומה ל-INP לפי ניווט בקרוסלה של מגש.

לאחר יצירת פרופיל של האינטראקציות האלה באמצעות חלונית הביצועים בכלי הפיתוח של Chrome, הבנו שספריית הניווט המרחבי קוראת את המיקום של כל הרכיבים שאפשר להתמקד בהם ובונה עץ חדש. זו פעולה יקרה שמפעילה רעידת פריסה בכל אינטראקציה, למשל מעבר מרכיב אחד לרכיב אחר.

בדף הבית, ספריית הניווט המרחבי יצרה עץ באופן הבא:

עץ לדוגמה שנוצר על ידי ספריית הניווט המרחבי. מתחת לשורש נמצאים הצמתים Navbar ו-Tray Container. באופן ספציפי, הצומת Tray Container מכיל שלושה צמתים של כרטיסים, לכל אחד מהם יש מספר רב של צמתים משניים שתורמים לגודל DOM גדול.
עץ הניווט המרחבי הקודם לדף הבית.

כלומר, אם באפליקציה מוצגים 10 מגשיים, ובכל מגש יש 7 כרטיסים, יהיו 70 רכיבים שאפשר להתמקד בהם במאגר המגשים, כולל פריטי הניווט. זהו מספר גבוה של רכיבים אינטראקטיביים. בנוסף, השתמשו בספריית קרוסלה של צד שלישי, שקוראת את המאפיינים של כל כרטיס במהלך ניווט אופקי כדי לתרגם את המאגר, וכך הוסיפה עוד זמן אחזור לאינטראקציה.

פתרון הבעיות

היו כמה בעיות שונות שצריך לטפל בהן בנפרד כדי לפתור את בעיות התגובה של האפליקציה כולה.

שיפורים בניווט בערימה האופקית

ב-Disney+ Hotstar יצרו ספריית קרוסלה משלהם, שלא גורמת ל-layout thrashing באמצעות שימוש באנימציות מורכבות וקריאת המאפיינים פעם אחת לכל מגש, במקום פעם אחת לכל כרטיס.

הניווט המרחבי מתמקד רק ברמה הבסיסית של הקרוסלה, ולניווט אופקי נוסף נכנסת לתמונה הקרוסלה בהתאמה אישית. בעזרת הגישה הזו, ב-Disney+ Hotstar הסירו את התלות בניווט המרחבי ובספריית הקרוסלה הישנה, שקראת את המאפיינים בכל ניווט.

כך נראה עץ הניווט המרחבי אחרי ביצוע פעולות האופטימיזציה האלה.

דוגמה לעץ מותאם שמופעל על ידי ספריית הניווט המרחבי. העץ הזה עבר אופטימיזציה משמעותית בהשוואה לגרסה הקודמת, והוא מכיל הרבה פחות צמתים.
עץ הניווט המרחבי אחרי האופטימיזציה.

התמונות הבאות הן השוואה של הביצועים שנמדדו בלוח הביצועים של Chrome DevTools לפני ואחרי הטמעת הקרוסלה.

צילום מסך של חלונית הביצועים ב-Chrome DevTools לגבי המשימות שהקרוסלה של הצד השלישי מפעילה. יש הרבה משימות ארוכות שמתעכבות את האינטראקטיביות.
קרוסלה של צד שלישי.
צילום מסך של חלונית הביצועים ב-Chrome DevTools לגבי המשימות שהקרוסלה הפנימית מפעילה. בהשוואה לקרוסלה של הצד השלישי, יש הרבה פחות משימות ארוכות, וכך האינטראקציות מתרחשות מהר יותר.
קרוסלה פנימית.

כתוצאה מהעבודה הזו, ב-Disney+ Hotstar ראו ירידה משמעותית ב-INP של האפליקציה בשטח. בנוסף, הם הצליחו לחסוך כ-35KB (דחוס) על ידי הסרת הספרייה של הצד השלישי. כתוצאה מהשיפורים האלה, ב-Disney+ Hotstar הצליחו גם לקצר את משך הזמן של המדד המותאם אישית שבו הם משתמשים כדי למדוד את זמן הרינדור הכולל של דף הבית, כי הפריסות מופעלות בתדירות נמוכה יותר עקב צמצום של צמתים של ניווט מרחבי.

סדרה כרונולוגית של המדד המותאם אישית 'זמן העיבוד של הדף' גם ב-tizentv וגם ב-webos, שהירידה בו הייתה 31% ו-25.2% בהתאמה, החל מהתקופה שבין 13 במרץ ל-19 במרץ.
מגמה של ירידה בזמני העיבוד של דפים לפי מערכת ההפעלה של הטלוויזיה (Samsung-Tizen ו-WebOS-LG).

שיפורים בניווט בחלונית האנכית

ב-Disney+ Hotstar גם שיפרו את הביצועים של הניווט במדף האנכי על ידי טעינה איטית של המדפים במקום לטעון את כולם מראש. לכן, בזמן טעינת הדף, במקום לטעון 10 מופעים של המגש – שבכל אחד מהם יש רכיב קרוסלה וקבוצה של תמונות – האפליקציה טוענת רק את שני המגשים שגלויים בחלון התצוגה, ועוד מגש אחד מעל ומטה. בנוסף, הטרנספורמציה (העיבוד) התחלקה לכמה משימות באמצעות אסטרטגיית ההענקה (yielding) setTimeout(), כדי שלליבה יהיו יותר הזדמנויות לטפל באינטראקציות של המשתמשים.

תצוגה חזותית מסוגננת של משימות להפעלת פונקציות טיפול באירועים ולעיבוד עדכונים. עדכוני העיבוד מתעכבים אחרי משימה ארוכה אחת.
משימה אחת ממושכת, ואחריה עיבוד לפני השיפור של מגש האפליקציות האנכי.
תצוגה חזותית נוספת של אותה פעילות כמו בתרשים הקודם, אבל המשימות מחולקות בגלל הענקת זמן למעבד (yielding), וכך הניתוח מתבצע מוקדם יותר.
משימות מפוצלות מרובות אחרי שיפור של מגש אנכי, עם הזדמנויות לעיבוד בין המשימות המפוצלות.

אינטראקציות במהלך טעינת הדף הראשונית

הערך של INP יהיה גבוה באפליקציות שמעבדות מספר עצום של סקריפטים במהלך ההפעלה של האפליקציה. הסיבה לכך היא שהדפדפן צריך להוריד, לנתח ולהעריך את הסקריפטים האלה. בזמן שהפעולות האלה מתבצעות, ייתכן שהשרשור הראשי יהיה עסוק במשך זמן רב ולא יוכל להגיב במהירות לאינטראקציות של משתמשים.

ב-Disney+ Hotstar הבינו שהם מעבדים יותר סקריפטים ממה שנחוץ בפועל במהלך הפעלת האפליקציה (בזמן המסך הפותח) כדי לזרז את טעינת הדפים בעתיד. כתוצאה מכך, נוצרו משימות נוספות של הערכת סקריפט, שגם הן עלולות להשפיע לרעה על INP.

כדי לפתור את הבעיה, הצוות של Disney+ Hotstar שקל לטעון באופן דינמי את רוב הנכסים, כדי לחסוך זמן במהלך הפעלת האפליקציה. עם זאת, הפעולה הזו הייתה מאריכה את זמני הטעינה של ניווט לדפים עתידיים, כי הקוד של JavaScript לא ייטען מראש בעקבות השינוי הזה. כדי להתמודד עם הבעיה הזו, צוות Disney+ Hotstar פיתח ספרייה פנימית של טעינת נכסים מראש, שמאפשרת לקבוע איזה דף עשוי להופיע בשלב הבא בתהליך השימוש של המשתמש, ולטעון מראש נכסים לדף הזה. לדוגמה:

  • כשמשתמש נמצא בדף ההתחברות, ספריית הנכסים הדיגיטליים שהוטענו מראש טעינה מראש את הנכסים לדף בחירת הפרופיל.
  • בדף בחירת הפרופיל, הנכסים של דף הבית נטענים.
  • בדף הבית נטענים הנכסים של דף הפרטים.
  • לבסוף, הנכסים של דף הצפייה נטענים בדף הפרטים.

אופטימיזציה של טעינת הנכסים עזרה ל-Disney+ Hotstar בשני דברים: צמצום ה-INP של האפליקציה (כי כעת לשרשור הראשי יש זמן פנוי יחסית לביצוע אינטראקציות של משתמשים), וגם צמצום השימוש בזיכרון במכשירים ברמה נמוכה.

השינויים האלה הובילו לירידה של 32% במספר ה-INP שדווח מהשדה, כפי שאפשר לראות בצילום המסך הבא.

סדרה זמנית של ערכי INP החל מ-13 באוגוסט ועד 11 בספטמבר. במהלך התקופה הזו, חלה ירידה של 32% ב-INP.
הפחתת INP לשיפורים במדף.

שיפורים אחרים

ב-Disney+ Hotstar גם גילו שיש משימות ארוכות בכמה אירועי משתמשים שאפשר לפצל על ידי החזרת השליטה לשרשור הראשי לעיתים קרובות. הם גם הרחיבו את הפעולה הזו ויצרו כלי ליצירת משימות שיאפשר למשתמשים לבטל את המשימה באמצע הביצוע שלה.

לדוגמה, כשהמשתמש מנווט בין כמה כרטיסים במגש, מתרחשים האירועים הבאים:

  • המיקוד עובר לכרטיס הבא.
  • הכרטיס מתורגם אם יש צורך בכך.
  • התכונה 'התמקדות במישהו אחד' מתעדכנת.
  • המערכת מאחזרת את הטריילר (אם יש כזה) ומפעילה את ההפעלה.
  • אירועים של Analytics מופעלים עבור הפעולה.

אם במהלך התהליך המשתמש מתמקד בכרטיס הבא, לא יהיה צורך לבצע את שאר השלבים. לדוגמה, אם המשתמש עבר לכרטיס הבא, לא תהיה יותר צורך באחזור טריילר ובאיפוס הנגן של כותר מסוים. לכן, אפשר לבטל את המשימות האלה כדי לפנות את השרשור הראשי.

הכלי ליצירת משימות של Disney+ Hotstar מקבל פונקציה שהיא משימה, וכאשר נכנסת משימה אחרת באמצע, המשימה הקודמת מבוטלת. כך אנחנו חוסכים ביצוע משימות מיותרות ומבצעים במהירות את המשימה הנדרשת.

תוצאות

באופן כללי, זמן ה-INP של אפליקציית Disney+ Hotstar ירד מ-675 אלפיות השנייה ל-272 אלפיות השנייה, שיפור של כמעט 60%! בנוסף, זמני האחזור של האינטראקציה עם התיבה ספציפית ירדו מ-400 אלפיות השנייה ל-100 אלפיות השנייה.

ערכים של INP ברצף זמן מ-23 באוגוסט עד 21 בספטמבר. בפרק הזמן הזה, נרשמה ירידה של 61% ב-INP.

ההשפעה על העסק: מספר הצפיות השבועיות בכרטיסים עלה מ-111 ל-226 לכל משתמש. זו עלייה של 100%, שממחישה שסביר יותר שממשק מהיר יותר ותגובה מהירה יותר יעוררו עניין בקרב משתמשים למשך תקופות זמן ארוכות יותר.

צילום מסך של סדרת נתונים על ציר הזמן שבו מוצגת עלייה של 100% במספר הצפיות השבועיות בכרטיסים באפליקציית Disney+ HotStar גם ב-tizentv וגם ב-webos. העלייה חדה מאוד אחרי 4 באפריל 2004.

זה רק ההתחלה, ו-Disney+ Hotstar רק התחילה לשפר את הביצועים של העיבוד והאינטראקציה בעזרת מדד INP. הצוות שלהם שמח להפוך את Disney+ Hotstar לחוויה חלקה ללקוחות בעתיד הקרוב.

תודה ל-Ayush, ‏ Ajay, ‏ Kiran, ‏ Milan ו-Richa מ-Disney+ Hotstar על המאמצים שלהם לשנות את המצב.

תודה מיוחדת ל-Ankeet Maini, מנהל ההנדסה של Disney+ Hotstar, ול-Rahul Krishnan P, מנהל חוויית הלקוח של Disney+ Hotstar, על התמיכה בפרויקט החדשנות הזה, ול-Jeremy Wagner, ‏ Gilberto, ‏ Barry Pollard ו-Brendan Kenny מ-Google על הבדיקה ועל העזרה בפרסום של מחקר המקרה הזה.