סשנים איטיים

'סשנים איטיים' הוא מדד חדש של תפקוד האפליקציה ב-Google Play Console. A איטי הוא סשן שבו יותר מ-25% מהפריימים הם איטיים. מסגרת איטי אם הוא לא מוצג פחות מ-50 אלפיות השנייה אחרי הפריים הקודם (שווה ל-20FPS). תפקוד האפליקציה מדווח גם על סשנים איטיים נוספים עם יעד של 34 אלפיות שנייה (שווה ל-30 FPS). באמצעות סשנים איטיים, יכול להבין את ביצועי קצב הפריימים של המשחק, וזה משפיע על האופן שבו חלק וגמיש במשחק שלך.

בהמשך, מערכת Play תתחיל להרחיק את המשתמשים ממשחקים שלא יכולים מגיעים ל-20 FPS בטלפונים שלהם. לתשומת ליבך, התכונה 'תפקוד האפליקציה' מתחילה רק לעקוב קצב הפריימים לאחר שהמשחק פעל במשך דקה.

פרטים נוספים זמינים במרכז העזרה לגבי המדד.

גרפיקה דמוית תרשים עוגה שמציגה את מספר הפריימים האיטיים והפריימים הלא איטיים.
איור 1. סשן איטי בתפקוד האפליקציה.

איך למדוד FPS ולזהות פריימים איטיים

הפקודה dumpsys surfaceflinger timestats ב-Android מספקת FPS ממוצע היסטוגרמה של התזמון מהצגה עד היום לכל השכבות שעבר עיבוד. הזמן מהצגה עד היום של פריים הוא המרווח שבין המערכת משרטטת את הפריים הנוכחי והפריים הקודם. הנה רשימה של כדי להשתמש בפקודה כדי לאסוף את ה-FPS של המשחק, צריך לבצע את השלבים הבאים:

  1. מריצים את הפקודה עם הדגלים enable ו-clear כדי להתחיל לצלם מידע:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. כשהמשחק יופעל מספיק זמן, מריצים שוב את הפקודה עם סימון dump להעלאת מידע:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

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

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

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

    לדוגמה, אחוז הפריימים האיטיים של 20FPS = (סכום הערכים מ-54 אלפיות השנייה עד 1,000 אלפיות השנייה) / totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    ה-FPS הממוצע של כל שכבה מוצג גם בקובץ ה-Dump:

    ...
    averageFPS = 30.179
    ...
    
  3. לאחר איסוף כל המידע, עליך להשבית את נתוני זמנים באמצעות הדגל disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

סיבות ופתרונות לפריימים איטיים

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

להשתמש ב-Android Frame Pacing (Swappy), Vulkan ו-ADPF לטפל בבעיות האלה ולשפר את ביצועי המשחק.

מה זה Swappy

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

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

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

איך להשתמש ב-Sהחלפה בפרויקטים מותאמים

במדריכים הבאים מוסבר איך לשלב את ספריית Android Frame Pacing למשחק שלך:

איך משתמשים ב-Sהחלפה במנוע המשחק של Unity

ב-Unity שילבה את Android Frame Pacing במנוע שלה. כדי להפעיל את האפשרות הזאת ב-Unity 2019.2 ואילך, מסמנים את התיבה 'אופטימיזציה של קצב הפריימים' בקטע הגדרות פרויקט > נגן > הגדרות עבור Android > רזולוציה והצגה:

תיבת הדו-שיח להגדרות הפרויקט.
איור 2. מפעילים את קצב הפריימים ב-Unity Engine.

לחלופין, מפעילים באופן פרוגרמטי את האפשרות Optimized Frame Pacing בקוד הלוגי כדי לאפשר ל-Unity לפעול באופן שווה הפצה של פריימים כדי להפחית את השונות בקצב הפריימים, וכך גיימפליי חלק יותר.

איך משתמשים ב'החלפה' במנוע המשחק Unreal

גרסה 4.25 ואילך של Unreal משלבת את ספריית Android Frame Pacing, שהיא חלק ערכת פיתוח המשחקים של Android. המאמר קצב פריימים בנייד מסביר איך להפעיל את Android ספריית קצב הפריימים ואיך לשלוט בקצב הפריימים מקוד C++.

מה זה Vulkan

Vulkan הוא מודל תלת-ממדי מודרני בפלטפורמות שונות ממשק API גרפי שמיועד למזער הפשטה בין חומרת גרפיקה של המכשיר לבין המשחק שלך. Vulkan הוא ה-API הראשי ברמה נמוכה לגרפיקה ב-Android, מחליפים את OpenGL ES. OpenGL ES עדיין נתמך ב-Android, אבל הוא כבר לא נכלל בתכונה פעילה ופיתוח.

ב-Vulkan יש את היתרונות הבאים על פני OpenGL ES:

  • ארכיטקטורה יעילה יותר עם תקורה נמוכה יותר של המעבד (CPU) במנהל התקן הגרפי
  • אסטרטגיות אופטימיזציה חדשות לשיפור הביצועים של המעבד (CPU)
  • תכונות גרפיקה חדשות שאינן זמינות ב-OpenGL ES, כמו ממשקי API לא מקושרים ניתוב קרניים

איך משתמשים ב-Vulkan בפרויקטים מקוריים של Android

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

איך משתמשים ב-Vulkan במנוע המשחק של Unity

כדי להפעיל בחירת מכשירים אוטומטית ב-Unity, מבצעים את השלבים להגדרה Auto Graphics API

תיבת הדו-שיח להגדרות הפרויקט.
איור 3. מפעילים את Unity Auto Graphics API.

לחלופין, אפשר להפעיל את Vulkan באופן ידני על ידי השבתה של Auto Graphics API, ומציבים את Vulkan בעדיפות הגבוהה ביותר ברשימה graphic APIs. אם אתם באמצעות Unity 2021.1 או גרסה קודמת, זו הדרך היחידה להשתמש ב-Vulkan.

תיבת הדו-שיח להגדרות הפרויקט.
איור 4. בחירה ידנית של Vulkan כ-API ראשי של Graphics API ב-Unity.

להשתמש בפלאגין של Vk Quality Unity Engine כדי לספק המלצות בזמן ההשקה של ה-graphic API לשימוש במשחק שלכם במכשירים מסוימים.

איך משתמשים ב-Vulkan במנוע המשחק Unreal

כדי להפעיל את Vulkan Graphics API, עוברים אל Project Settings > פלטפורמות > Android > build ובוחרים באפשרות Support Vulkan. כשבוחרים גם באפשרות תמיכה Vulkan ותמיכה ב-OpenGL ES3.2, מערכת Unreal משתמשת ב-Vulkan כברירת מחדל. אם המכשיר לא תומך ב-Vulkan, Unreal משתמש ב-OpenGL ES 3.2.

תיבת הדו-שיח להגדרות הפרויקט.
איור 5. הפעלת Vulkan ב-Unreal Engine.

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

מה זה ADPF

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

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

אלו הם התכונות העיקריות של ADPF:

  • Thermal API: מעקב אחר המצב התרמי של המכשיר כדי שהאפליקציה תוכל להתאים באופן יזום את עומס העבודה לפני שהוא הופך לבלתי בר-קיימא.
  • CPU Performance Hint API: אפשר לספק רמזים לגבי הביצועים שמאפשרים ל-Android לבחור את הגדרות הביצועים המתאימות (לדוגמה, נקודת הפעלה של המעבד (CPU) או ליבה) לעומס העבודה.
  • Game Mode API ו-Game State API: אתם יכולים להפעיל אופטימיזציה של משחקים על ידי מתן עדיפות לביצועים או למאפיינים של חיי הסוללה בהתאם להגדרות המשתמש ולהגדרות הספציפיות למשחק.
  • מצב ביצועים קבועים: הפעלת מצב ביצועים קבועים במכשיר במהלך ההשוואה לשוק כדי לקבל מדידות שלא עוברות שינוי על ידי השעון הדינמי של המעבד (CPU).
  • מצב יעילות כוח: מציין לסשן שאפשר לתזמן בצורה בטוחה את השרשורים בסשן של רמז לביצועים, כך שהעדפה של היעילות של צריכת החשמל תהיה גבוהה יותר מהביצועים. התכונה זמינה ב-Android 15 (API leve 35).

איך משתמשים ב-ADPF בפרויקטים מקוריים של Android

שילוב תכונות של יכולת התאמה במשחק המקורי שלכם מנחה אתכם איך לשלב תכונות ADPF משחק עם צעדים שניתן ללכת בהם בקצב שלך. בסוף המשימה תשלבו את התכונות הבאות:

  • תרמי API: מאזינים למצב הטמפרטורה של המכשיר ומגיבים לפני שהמכשיר עובר למצב ויסות חום (throttle).
  • ממשק API של מצב משחק: מבינים את העדפות האופטימיזציה של הנגן (מיקסום הביצועים או חיסכון בסוללה) ומבצעים שינויים בהתאם.
  • Game State API: מאפשר למערכת לדעת את מצב המשחק (טעינה, משחק, ממשק משתמש וכו'), והמערכת יכולה להתאים את המשאבים בהתאם (שיפור קלט/פלט (I/O), מעבד (CPU), מעבד (GPU) וכו').
  • Performance Hint API: אתם יכולים ליידע את המערכת מהו מודל השרשורים ועומס העבודה שלכם, כדי שהמערכת תוכל להקצות משאבים בהתאם.

איך משתמשים ב-ADPF במנוע המשחק של Unity

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

ספק Android של ביצועים מותאמים ידריך אותך בשלבים להטמעת ADPF ב-Unity.

תיבת הדו-שיח להגדרות הפרויקט.
איור 6. משלבים ADPF ב-Unity Engine.

איך משתמשים ב-ADPF במנוע המשחק Unreal

תיבת הדו-שיח להגדרות הפרויקט.
איור 7. משלבים ADPF ב-Unreal Engine.
  1. להוריד את הפלאגין
  2. מעתיקים את הפלאגין לתיקיית הפלאגין של הפרויקט.
  3. הפעלת הפלאגין ADPF Unreal Engine בעורך Unreal
  4. הפעלה מחדש של העורך של Unreal
  5. בונים ומבשלים את המשחק

הפלאגין Android Dynamic Performance Framework(ADPF) ל-Unreal Engine מספק ביצועים יציבים ומונע ויסות נתונים (throttle) תרמי. להורדת הפלאגין מ-GitHub. הפלאגין הזה משנה תכונות באמצעות הגדרה ערכים לא מציאותיים במסוף.