יכולות התצוגה (כמו מצבי תצוגה וסוגי HDR נתמכים) יכולות להשתנות באופן דינמי במכשירים שמחוברים אליהם מסכים חיצוניים (עם HDMI או DisplayPort), כמו ממירים של Android TV ומכשירי OTT. השינוי הזה יכול לקרות כתוצאה מאות HDMI hotplug, למשל כשמשתמש עובר ממסך אחד למסך אחר או מפעיל את המכשיר בלי מסך מחובר. Android מגרסה 12 ואילך כולל שינויים במסגרת לטיפול בהוספה והסרה של רכיבים בזמן שהמערכת פועלת (hotplugging) וביכולות דינמיות של התצוגה.
בדף הזה מוסבר על הטיפול בהחלפה מהירה של צגים ושינויים ביכולות הצגים בהטמעה של Composer HAL. בנוסף, מוסבר איך לנהל את מאגר המסגרות המשויך ולמנוע מרוץ תהליכים במצבים האלה.
עדכון יכולות התצוגה
בקטע הזה מוסבר איך מסגרת Android מטפלת בשינויים ביכולות התצוגה שמופעלים על ידי Composer HAL.
כדי שמערכת Android תוכל לטפל כראוי בשינויים ביכולות התצוגה, יצרן הציוד המקורי צריך להטמיע את Composer HAL כך שישתמש ב-onHotplug(display, connection=CONNECTED)
כדי להודיע למסגרת על שינויים ביכולות התצוגה. אחרי שמטמיעים את השינוי הזה, מערכת Android מטפלת בשינויים ביכולות התצוגה באופן הבא:
- כשמזוהה שינוי ביכולות התצוגה, ה-Framework מקבל התראה
onHotplug(display, connection=CONNECTED)
. - כשמתקבלת ההתראה, המסגרת משחררת את מצב התצוגה ויוצרת אותו מחדש עם היכולות החדשות מ-HAL באמצעות השיטות
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
ו-getDisplayCapabilities
. - אחרי שהמסגרת יוצרת מחדש מצב תצוגה חדש, היא שולחת את הקריאה החוזרת
onDisplayChanged
לאפליקציות שממתינות לאירועים כאלה.
המסגרת מקצה מחדש את מאגרי המסגרות באירועי onHotplug(display, connection=CONNECTED)
עוקבים. מידע נוסף על ניהול נכון של זיכרון מאגר המסגרות כדי למנוע כשלים במהלך הקצאה של מאגרי מסגרות חדשים זמין במאמר בנושא ניהול מאגר המסגרות של הלקוח.
טיפול בתרחישי חיבור נפוצים
בקטע הזה מוסבר איך לטפל בצורה נכונה בתרחישי חיבור שונים בהטמעות שלכם, כשהמסך הראשי מחובר ומנותק.
מסגרת Android נוצרה למכשירים ניידים, ולכן אין בה תמיכה מובנית במסך ראשי מנותק. במקום זאת, ה-HAL צריך להחליף את המסך הראשי במסך placeholder באינטראקציות שלו עם המסגרת במקרה של ניתוק פיזי של המסך הראשי.
התרחישים הבאים יכולים להתרחש בממירים ובמתאמים לטלוויזיה עם מסכים שמחוברים חיצונית וניתנים לניתוק. כדי להטמיע תמיכה בתרחישים האלה, אפשר להיעזר במידע שבטבלה הבאה:
תרחיש | שימוש |
---|---|
אין מסך מחובר בזמן האתחול |
|
המסך הראשי מחובר פיזית |
|
המסך הראשי מנותק פיזית |
|
שיקולים לגבי חיבור שאינו HDMI
ב-Android TV קיימת תמיכה רק ברזולוציות הבאות:
- 720x1280
- 1080x1920
- 2160x3840
- 4320x7680
כשממיר או מתאם לטלוויזיה מנסים להציג רזולוציה שלא נתמכת, כמו 480i בחיבור CVBS, מוצגת למשתמש הודעת שגיאה.
אם לממיר או למתאם ה-TV יש חיבור HDMI וחיבור שאינו HDMI, חיבור ה-HDMI הוא התצוגה הראשית והחיבור שאינו HDMI לא פעיל. כתוצאה מכך, אם חיבור ה-HDMI מנותק בזמן שחיבור שאינו HDMI עדיין מחובר, אירוע נשלח אל SurfaceFlinger והיכולות של המסך שאינו HDMI צריכות להשתקף דרך getDisplayAttribute
וממשקי API אחרים של iComposerClient
(כמו getHdrCapabilities
).
שימוש במזהי הגדרות עוקבים כדי למנוע מרוץ תהליכים
מצבי מירוץ יכולים להתרחש אם ה-HAL של Composer מעדכן את תצורות התצוגה הנתמכות במקביל למסגרת שקוראת ל-setActiveConfig
או ל-setActiveConfigWithConstraints
.
הפתרון הוא להטמיע את Composer HAL כדי להשתמש במזהים עוקבים ולמנוע את הבעיה הזו.
בקטע הזה מוסבר איך מרוץ תהליכים עלול להתרחש, ואחריו מפורט איך להטמיע את Composer HAL כך שישתמש במזהים עוקבים כדי למנוע מצבים כאלה.
כדאי לשים לב לרצף האירועים הבא, שבו לא מוקצים מזהים חדשים ורציפים להגדרות התצוגה החדשות, מה שגורם לתנאי מירוץ:
מזהי התצורה הנתמכים של התצוגה הם:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
המסגרת קוראת ל-
setActiveConfig(display, config=1)
.במקביל, ה-HAL של Composer מעבד שינוי בהגדרות התצוגה ומעדכן את המצב הפנימי שלו לקבוצה חדשה של הגדרות תצוגה, כפי שמוצג בהמשך:
- id=1, 2160x3840 60 Hz
- id=2, 2160x3840 50 Hz
- id=3, 1080x1920 60 Hz
- id=4, 1080x1920 50 Hz
Composer HAL שולח אירוע
onHotplug
למסגרת כדי להודיע שקבוצת המצבים הנתמכים השתנתה.ה-HAL של Composer מקבל את
setActiveConfig(display, config=1)
(משלב 2).ה-HAL מפרש שה-framework ביקש שינוי בהגדרה ל-2160x3840 60 Hz, למרות שבפועל הרזולוציה הרצויה הייתה 1080x1920 60 Hz.
התהליך שבו נעשה שימוש בהקצאות מזהים לא עוקבות מסתיים כאן בפרשנות שגויה של שינוי ההגדרה הרצוי.
הגדרת Composer HAL לשימוש במזהים עוקבים
כדי להימנע ממצבי מירוץ כאלה, יצרן הציוד המקורי צריך להטמיע את Composer HAL באופן הבא:
- כש-Composer HAL מעדכן את תצורות התצוגה הנתמכות, הוא מקצה מזהים חדשים ורציפים לתצורות התצוגה החדשות.
- כשמסגרת העבודה קוראת ל-
setActiveConfig
או ל-setActiveConfigWithConstraints
עם מזהה תצורה לא תקין, ה-HAL של Composer מתעלם מהקריאה.
השלבים האלה נועדו למנוע מצבי מירוץ, כפי שמוסבר בהמשך.
כדאי לעיין ברצף האירועים הבא, שמתרחש כשמוקצים מזהים חדשים ורציפים להגדרות התצוגה החדשות:
מזהי התצורה הנתמכים של התצוגה הם:
- id=1, 1080x1920 60 Hz
- id=2, 1080x1920 50 Hz
המסגרת קוראת ל-
setActiveConfig(display, config=1)
.כשמעבדים שינוי בהגדרות התצוגה, המערכת מקצה את קבוצת מזהי ההגדרות הבאה החל מהמספר השלם הבא שלא נמצא בשימוש, כמו שמוצג כאן:
id=3, 2160x3840 60 Hz
id=4, 2160x3840 50 Hz
id=5, 1080x1920 60 Hz
id=6, 1080x1920 50 Hz
ה-HAL של Composer שולח אירוע
onHotplug
ל-framework כדי להודיע שקבוצת המצבים הנתמכים השתנתה.ה-HAL של Composer מקבל
setActiveConfig(display, config=1)
(משלב 2).ה-HAL של Composer מתעלם מהשיחה כי המזהה כבר לא תקף.
המסגרת מקבלת ומעבדת את האירוע
onHotplug
משלב 4. היא קוראת ל-HAL של Composer באמצעות הפונקציותgetDisplayConfigs
ו-getDisplayAttribute
. בעזרת הפונקציות האלה, המסגרת מזהה את המזהה החדש (5) של הרזולוציה וקצב הרענון הרצויים של 1080x1920 ו-60 הרץ.המסגרת שולחת אירוע
setActiveConfig
נוסף עם מזהה מעודכן של 5.ה-HAL של Composer מקבל
setActiveConfig(display, config=5)
משלב 5.ה-HAL מפרש בצורה נכונה שה-framework ביקש שינוי בהגדרה ל-1080x1920 60 Hz.
כפי שמוצג בדוגמה שלמעלה, התהליך שבו נעשה שימוש בהקצאות מזהים רציפות מבטיח מניעה של מרוץ התהליכים ועדכון של שינוי הגדרת התצוגה הנכונה.