קצב מסגרת

ספריית Android Frame Pacing, הידועה גם בשם Swappy, היא חלק מ- Android Game SDK . זה עוזר למשחקי OpenGL ו- Vulkan להשיג עיבוד חלק וקצב פריימים נכון באנדרואיד.

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

  • חציצה של מסגרות עבר פנימיות
  • זיהוי הגשות פריים מאוחרות
  • המשך הצגת המסגרת הנוכחית כאשר מזוהה מסגרת מאוחרת

זמני תצוגת פריימים לא עקביים נגרמים על ידי לולאת רינדור של משחק הפועלת בקצב שונה מזה שתומכת בחומרת התצוגה המקורית. בעיות מתעוררות כאשר לולאת העיבוד של המשחק פועלת לאט מדי עבור חומרת התצוגה הבסיסית, מה שמוביל לזמני תצוגה לא עקביים. לדוגמה, כאשר משחק שרץ במהירות של 30 פריימים לשנייה מנסה לבצע רינדור במכשיר שתומך באופן מקורי ב-60 פריימים לשנייה, לולאת הרינדור של המשחק גורמת למסגרת חוזרת ונשנית להישאר על המסך למשך 16 אלפיות השנייה. סוג זה של ניתוק יוצר חוסר עקביות מהותי בזמני פריים כגון 33 אלפיות השנייה, 16 שניות שניות, 49 אלפיות השנייה וכן הלאה. סצנות מורכבות מדי מחמירות את הבעיה הזו מכיוון שהן גורמות להופעת פריימים שהוחמצו.

ספריית Frame Pacing מבצעת את המשימות הבאות:

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

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

כדי ליישם שימוש ב-OpenGL renderer או Vulkan renderer, ראה

לקריאה נוספת, ראה השגת קצב פריימים מתאים .

התערבות מצערת פריימים לשנייה

התערבות מצערת של פריימים לשנייה (FPS) מאפשרת למשחקים לצעוד ב-FPS מתאים תוך שימוש רק בשינויים בצד הפלטפורמה וללא צורך בפעולה כלשהי מצד המפתחים.

היישום של התערבות המצערת FPS משתמש ברכיבים הבאים:

GameManagerService

רכיב GameManagerService שומר על כל המידע לכל משתמש ולכל משחק של מצב משחק והתערבות במשחק. מידע ה-FPS מאוחסן ב-GameManagerService עם מידע התערבות אחר, כגון גורם הורדת הרזולוציה, במיפוי <PACKAGE_NAME, Interventions> עבור כל פרופיל משתמש. ניתן לגשת למידע FPS כאשר מצב המשחק משתנה או ההתערבות מתעדכנת. UID ייחודי לכל PACKAGE_NAME ומשתמש, וניתן לתרגם אותו לצמד <UID, Frame Rate> לשליחתו ל-SurfaceFlinger.

SurfaceFlinger

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

האיור הבא מתאר את האינטראקציה בין GameManagerService לבין SurfaceFlinger:

אינטראקציה בין GameManagerService לבין SurfaceFlinger

איור 1. אינטראקציה בין GameServiceManager לבין SurfaceFlinger

ה-SurfaceFinger שומר על מיפוי זוג <UID, Frame Rate> כדי להגדיר עדיפות חדשה למצערת קצב פריימים. ה- UID ייחודי בין משתמשים ומשחקים, כך שלכל משתמש במכשיר בודד יכולים להיות הגדרות שונות של קצב פריימים באותו משחק. כדי להצניע את קצב הפריימים של משחק, ה-GameServiceManager קורא ל- SurfaceFlinger כדי לעקוף את קצב הפריימים עבור UID. עם מנגנון זה, ה-SurfaceFlinger מעדכן את המיפוי בכל פעם שמצב המשחק משתנה או ההתערבות מתעדכנת. ה-SurfaceFlinger מטפל בשינוי ה-FPS על ידי נעילת מאגרים בהתאם.

כדי להבין יותר על מצערת FPS, ראה מבוא למצערת FPS .