קצב רענון מרובה

אנדרואיד 11 מוסיפה תמיכה במכשירים עם קצבי רענון מרובים. ישנם שלושה מרכיבים עיקריים לתכונה זו:

  • ממשקי API חדשים של HAL שהוצגו ב- android.hardware.graphics.composer@2.4 .
  • קוד פלטפורמה לנתח תצורות מכשיר לקצבי רענון שונים ולהגדיר את קצב הרענון הרצוי
  • ממשקי API חדשים של SDK ו-NDK כדי לאפשר לאפליקציות להגדיר את קצב הפריימים הרצוי להם

יישום

תמיכה ייעודית להחלפת קצב רענון נוספה ל- android.hardware.graphics.composer@2.4 HAL . אנו ממליצים בחום להשתמש בגרסה זו מכיוון שלגרסאות קודמות של המלחין HAL יש תמיכה מוגבלת במעבר קצב רענון.

קבוצות תצורה

תכונה חדשה CONFIG_GROUP נוספה ל- IComposerClient::Attribute הניתנת לשאילתה באמצעות ה-API getDisplayAttribute_2_4 . תכונה זו מאפשרת לספקים לקבץ יחד תצורות תצוגה. תצורות באותה קבוצה מאפשרות מעבר חלק ביניהן ברוב המקרים. קבוצת התצורה משמשת את הפלטפורמה כדי להבדיל אילו תצורות ניתן להחליף ביניהן על מנת להחליף את קצב הרענון ולא תכונות אחרות עבור תצורה.

שקול את הדוגמה הבאה שמדגימה את היתרונות של שימוש בקבוצות תצורה עם התקן שתומך בארבע תצורות תצוגה:

  • 1080p@60Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

למרות שהמכשיר תומך בקצבי רענון של 48Hz, 60Hz, 72Hz ו-90Hz, התצוגה פועלת במצב שונה ומעבר מ-60Hz ל-72Hz משנה את תצורת התצוגה מ-1080p ל-1080i, שאולי לא תהיה ההתנהגות הרצויה. זה נפתר באמצעות קבוצות תצורה. על ידי קיבוץ של 60Hz ו-90Hz יחדיו בקבוצת תצורה אחת ו-48Hz ו-72Hz בקבוצת תצורה אחרת. הפלטפורמה יודעת שהיא יכולה לעבור בין 60Hz ל-90Hz ובין 48Hz ל-72Hz אך לא בין 60Hz ל-72Hz מכיוון שהדבר יביא לשינוי תצורה במקום פשוט לשנות את קצב הרענון.

עדכוני Composer API

getDisplayVsyncPeriod
לשליטה טובה יותר ולחיזוי טוב יותר בעת שינוי קצבי הרענון התווסף getDisplayVsyncPeriod . getDisplayVsyncPeriod מחזירה את קצב הרענון הנוכחי (במונחים של תקופת vsync) בו התצוגה פועלת. זה שימושי במיוחד בזמן המעבר בין קצב הרענון לקצב הרענון הנוכחי נדרש לפלטפורמה כדי להחליט מתי להתחיל את המסגרת הבאה.
setActiveConfigWithConstraints
שיטת setActiveConfigWithConstraints היא הרחבה חדשה לשיטת setActiveConfig הקיימת ומספקת מידע נוסף על שינוי התצורה. האילוצים ניתנים כחלק מהפרמטרים vsyncPeriodChangeConstraints ומכילים את הפרמטרים הבאים.
    wishTimeNanos
    הזמן ב- CLOCK_MONOTONIC שאחריו תקופת ה-vsync עשויה להשתנות (כלומר, תקופת ה-vsync לא יכולה להשתנות לפני הזמן הזה). זה שימושי כאשר הפלטפורמה רוצה לתכנן מראש לשינוי בקצב הרענון, אך יש לה כבר כמה מאגרים בתור להצגה. הפלטפורמה מגדירה את הזמן הזה בהתאם להתחשב במאגרים הללו ולוודא שמעבר קצב הרענון יהיה חלק ככל האפשר.
    חלקהחובה
    אם זה נכון, מחייב ששינוי תקופת vsync חייב להתרחש בצורה חלקה ללא חפץ חזותי בולט. הדגל הזה משמש את הפלטפורמה כאשר יש צורך בשינוי בקצב הרענון כתוצאה משינוי בתוכן (לדוגמה, המכשיר לא פעיל והאנימציה מתחילה). זה נותן לספק את ההזדמנות לא לאפשר שינויים מסוימים בתצורה כאשר הם עלולים לגרום לחפץ חזותי בולט. אם לא ניתן לשנות את ההגדרות בצורה חלקה ו- seamlessRequired מוגדר כ- true , ההטמעה צפויה להחזיר SEAMLESS_NOT_POSSIBLE כקוד ההחזרה ולקרוא להתקשרות חוזרת החדשה onSeamlessPossible כאשר ניתן לבצע את אותו שינוי תצורה בצורה חלקה.

לאחר הצלחה היישום מחזיר VsyncPeriodChangeTimeline שאומר לפלטפורמה מתי לצפות לשינוי בקצב הרענון. יש להגדיר פרמטרים של newVsyncAppliedTimeNanos לשעה ב- CLOCK_MONOTONIC שבה התצוגה החדשה תתחיל להתרענן בתקופת ה-vsync החדשה. זה, יחד עם desiredTimeNanos מאפשר לפלטפורמה לתכנן מראש את מתג קצב הרענון ולהתחיל לתקתק אפליקציות לקצב הרענון החדש מראש. זה מאפשר מעבר חלק של קצב הרענון.

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

onVsyncPeriodTimingChanged [callback]
התקשרות חוזרת חדשה שניתן לקרוא לה על ידי ה-HAL כדי לציין לפלטפורמה כי פרמטר כלשהו של ציר הזמן השתנה והפלטפורמה צריכה להתאים את ציר הזמן שלה. התקשרות חוזרת זו צפויה להיקרא אם מסיבה כלשהי ציר הזמן הישן הוחמץ בגלל זמן עיבוד ארוך ב-HAL או מסגרת רענון מאוחרת.

כיצד מחליטה הפלטפורמה לשנות את קצב הרענון?

בחירת קצב הרענון מתרחשת בשני שירותי המערכת הבאים:

DisplayManager
ה- DisplayManager מגדיר את מדיניות הרמה הגבוהה סביב קצב הרענון. הוא מגדיר תצורת תצוגה ברירת מחדל, שזהה לתצורת ה-HAL של המלחין. בנוסף, הוא מגדיר טווח של ערכי מינימום ומקסימום לבחירת SurfaceFlinger כקצב הרענון.
SurfaceFlinger
קובע את קצב הרענון על ידי הגדרת תצורה שנמצאת באותה קבוצת תצורה כמו תצורת ברירת המחדל ועם קצב רענון בטווח המינימום/מקסימום.

מנהל התצוגה מבצע את השלבים הבאים כדי לקבוע את המדיניות:

  • מוצא את מזהה תצורת ברירת המחדל על ידי שאילתה של התצורה הפעילה מ- SurfaceFlinger
  • הגבלת טווח ערכי המינימום והמקסימום על ידי איטרציה על פני תנאי המערכת
    • הגדרת ברירת מחדל של קצב רענון : ערך ברירת המחדל של קצב הרענון מוגדר בשכבת העל של תצורת R.integer.config_defaultRefreshRate . ערך זה משמש לקביעת קצב הרענון הסטנדרטי של המכשיר עבור אנימציות ואינטראקציות מגע.
    • הגדרת קצב רענון שיא : ערך שיא קצב הרענון נקרא מ- Settings.System.PEAK_REFRESH_RATE . ערך זה משתנה בזמן הריצה כדי לשקף את הגדרת המכשיר הנוכחית (כגון אפשרות תפריט). ערך ברירת המחדל מוגדר בשכבת העל של תצורת R.integer.config_defaultPeakRefreshRate .
    • הגדרת קצב רענון מינימלי : ערך קצב הרענון המינימלי נקרא מתוך Settings.System.MIN_REFRESH_RATE . ניתן לשנות ערך זה בזמן ריצה כדי לשקף את הגדרת המכשיר הנוכחית (כגון אפשרות תפריט). ערך ברירת המחדל הוא 0, כך שאין מינימום ברירת מחדל.
    • יישום מבוקש ModeId : אפליקציות יכולות להגדיר את WindowManager.LayoutParams.preferredDisplayModeId כך שישקף תצורה מועדפת שהתצוגה אמורה לפעול בה. ברוב התנאים ה- DisplayManager מגדיר את מזהה תצורת ברירת המחדל בהתאם ומגדיר את קצב הרענון המינימלי והמקסימלי כך שיתאים לקצב הרענון של התצורה.
    • חיסכון בסוללה : קצב הרענון מוגבל ל-60 הרץ ומטה כאשר המכשיר נמצא במצב צריכת חשמל נמוכה, אשר מצוין דרך Settings.Global.LOW_POWER_MODE.

לאחר ש- DisplayManager מגדיר את המדיניות, SurfaceFlinger מגדיר את קצב הרענון בהתבסס על השכבות הפעילות (שכבות שמעמידות בתור עדכוני מסגרת). אם הבעלים של השכבה מגדיר קצב פריימים , SurfaceFlinger מנסה להגדיר את קצב הרענון למשהו שהוא מכפיל של קצב זה. לדוגמה, אם שתי שכבות פעילות מגדירות את קצב הפריימים שלהן ל-24 ו-60 SurfaceFlinger יבחר 120Hz אם הוא זמין. אם קצב רענון כזה אינו זמין ל- SurfaceFlinger, הוא ינסה לבחור את קצב הרענון בעל השגיאה המינימלית עבור קצב הפריימים. למידע נוסף עיין בתיעוד המפתחים בכתובת developer.android.com

SurfaceFlinger שומר על הדגלים הבאים כדי לשלוט כיצד נקבע קצב הרענון:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: אם מוגדר, קצב הרענון נקבע על סמך השכבות הפעילות, גם אם לא הוגדר קצב פריימים. SurfaceFlinger שומר על היוריסטיקה שבה היא מוצאת את ה-fps הממוצע שהשכבה מפרסמת חוצצים על ידי התבוננות בחותמת הזמן של המצגת המצורפת למאגר.
  • ro.surface_flinger.set_touch_timer_ms : אם > 0, ישמש קצב הרענון המוגדר כברירת מחדל כאשר משתמש נוגע במסך למשך הזמן הקצוב שהוגדר. היוריסטיקה זו נעשית כדי להיות מוכנה עם ברירת המחדל של קצב הרענון עבור אנימציות.
  • ro.surface_flinger.set_idle_timer_ms : אם > 0, ישמש קצב רענון מינימלי כאשר אין עדכוני מסך עבור הזמן הקצוב שהוגדר.
  • ro.surface_flinger.set_display_power_timer_ms : אם > 0, קצב הרענון המוגדר כברירת מחדל ישמש בעת הפעלת התצוגה (או בעת יציאה מ-AOD) עבור הזמן הקצוב שהוגדר.

API של קצב מסגרת

ממשק ה-API של קצב הפריימים מאפשר ליישומים ליידע את פלטפורמת Android על קצב הפריימים המיועד להם והוא זמין באפליקציות המכוונות ל-Android 11. למידע נוסף על ה-API של קצב הפריימים, עיין בתיעוד למפתחים ב- Developer.android.com .

אפשרויות למפתחים

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