הספרייה של Android Frame Pacing, שנקראת גם Swappy, היא חלק מ-Android Game SDK. הוא עוזר לשפר את העיבוד החלק של משחקי OpenGL ו-Vulkan וקצב פריימים נכון ב-Android.
קצב הפריימים הוא סנכרון הלוגיקה ולולאת הרינדור של המשחק מערכת משנה לתצוגה של מערכת הפעלה וחומרת מסך בסיסית. מסך Android תת-המערכת עוצבה כדי למנוע ארטיפקטים חזותיים מסוימים, כמו קרעים. מערכת המשנה של התצוגה מונעת קרעים על ידי ביצוע הפעולות הבאות:
- אחסון זמני של פריימים קודמים
- זיהוי שליחות מאוחרות של פריימים
- המשך הצגת הפריים הנוכחי כשמזוהה פריים מאוחר
זמני הצגת פריימים לא עקביים נגרמים כתוצאה מלולאת רינדור של משחק שפועלת ב- קצב שונה ממה שנתמך בחומרת המסך המקורית. מתעוררות בעיות כשלולאת העיבוד של משחק פועלת לאט מדי עבור חומרת המסך הבסיסית, שמובילות לזמני תצוגה לא עקביים. לדוגמה, כשמשחק שרץ ב- ניסיון לעבד 30 fps במכשיר שתומך במקור של 60 FPS, לולאת העיבוד של המשחק גורמת למסגרת חוזרת להישאר על המסך למשך 16 אלפיות שנייה נוספת. סוג הניתוק הזה גורם לחוסר עקביות משמעותי בזמני הפריימים למשל 33 אלפיות השנייה, 16 אלפיות השנייה, 49 אלפיות שנייה וכו'. סצנות מורכבות מדי מורכבות יותר את הבעיה כי הם גורמים לפריימים חסרים.
הספרייה 'קצב פריימים' מבצעת את המשימות הבאות:
- מתגמלת על מקטעים במסך בגלל פריימים קצרים במשחק.
- הוספת חותמות זמן של המצגת כדי שהפריימים יוצגו בזמן, ולא מוקדם.
- נעשה שימוש בסיומות חותמות הזמן של המצגת
EGL_ANDROID_presentation_time
ו-VK_GOOGLE_display_timing
.
- נעשה שימוש בגדרות סנכרון למסגרות ארוכות שמובילות לגמגם ולזמן אחזור.
- הזרקות מחכות לאפליקציה. הן מאפשרות לצינור עיבוד הנתונים של התצוגה לקלוט במקום לאפשר לחץ להיווצר.
- נעשה שימוש בגדרות סנכרון (
EGL_KHR_fence_sync
ו-VkFence
).
- בוחר קצב רענון כדי לספק גמישות והצגה חלקה, אם המכשיר תומך במספר קצבי רענון.
- הצגת נתונים סטטיסטיים לניפוי באגים וליצירת פרופילים באמצעות frame .
כדי ללמוד איך להגדיר את הספרייה לפעול במצבים שונים בהתאם כדי להבין מה בדיוק אתם צריכים, תוכלו להיעזר במצבי הפעלה נתמכים.
כדי להטמיע באמצעות כלי לרינדור OpenGL או Vulkan:
אפשר לקרוא מידע נוסף במאמר השגת קצב פריימים מתאים.
התערבות של ויסות נתונים (throttle) פריימים לשנייה
התערבות של ויסות נתונים (throttle) של פריימים לשנייה (FPS) מאפשרת למשחקים בקצב פריימים מתאים אתם משתמשים רק בצד הפלטפורמה ללא צורך בפעולה נוספת מצד המפתחים חלק.
בהטמעה של התערבות של ויסות נתונים (throttle) ב-FPS נעשה שימוש ברכיבים הבאים:
שירות GameManagerService
הרכיב GameManagerService מנהל את כל ההגדרות של
מידע לכל משחק על מצב המשחק והתערבות במשחק. פרטי ה-FPS מאוחסן
GameManagerService עם פרטי התערבות אחרים, כגון גורם הורדת הרזולוציה,
במיפוי <PACKAGE_NAME, Interventions>
לכל פרופיל משתמש.
מתבצעת גישה למידע ה-FPS כשמצב המשחק משתנה או כשמעדכנים את ההתערבות. א'
UID
הוא ייחודי לכל PACKAGE_NAME
ולכל משתמש, ואפשר להמשיך לתרגם אותו
בצמד <UID, Frame Rate>
כדי לשלוח ל-SurfaceFlinger.
SurfaceFlinger
הרכיב SurfaceFlinger כבר תומך ויסות נתונים (throttle) של ה-FPS של אפליקציה, כל עוד קצב הפריימים הוא מחלק של קצב הרענון במסך. במקרה של vsync, ה-SurfaceFlinger בודק את התוקף של ה-vsync של ויסות הנתונים (throttle) על ידי אימות אם חותמת הזמן של ה-vsync נמצאת בשלב עם קצב הפריימים תרגום מכונה. אם קצב הפריימים לא נמצא בשלב עם vsync, ה-SurfaceFlinger מחזיק עד שקצב הפריימים ו-vsync נמצאים בשלב.
האיור הבא מתאר את האינטראקציה בין GameManagerService לבין SurfaceFlinger:
ה-SurfaceFinger שומר על מיפוי של צמד של <UID, Frame Rate>
כדי להגדיר
קדימות לויסות נתונים (throttle) של קצב הפריימים. UID
הוא ייחודי בין משתמשים למשחקים, כך שכל אחד
לכל משתמש במכשיר אחד יכולות להיות הגדרות שונות של קצב פריימים באותו משחק. כדי לווסת את
קצב הפריימים של המשחק, ה-GameServiceManager קורא ל-SurfaceFlinger כדי לשנות את קצב הפריימים עבור
מזהה ייחודי. בעזרת המנגנון הזה, SurfaceFlinger מעדכן את המיפוי בכל פעם
מצב המשחק משתנה או שההתערבות מתעדכנת. ה-SurfaceFlinger מטפל בשינוי ה-FPS
על ידי נעילת מאגר הנתונים הזמני בהתאם.
מידע נוסף על ויסות נתונים (throttle) ב-FPS זמין במאמר מבוא לויסות נתונים (throttle) של FPS.