ב-Mir 2 נעשה שימוש ב-Swappy כדי לשפר את ביצועי הרינדור

Mir 2: Return of the King הוא משחק נייד איכותי עם IP של Legend שאושר על ידי Actoz Soft ופותח על ידי HK ZHILI YAOAN LIMITED באמצעות Unity Engine.

המשחק הזה לא רק יוצר מחדש בצורה מושלמת את התחושות של Mir 2, נציג של משחקי MMORPG פנטזיה קוריאניים, אלא גם מציע הרבה מהתכנים הפופולריים ביותר של המשחק, כמו איסוף ציוד, התקפת חול בקנה מידה גדול ועוד משחקיות ליבה.

במשחק נעשה שימוש ב-Android Frame Pacing API‏ (Swappy) כדי לשפר את היציבות של קצב הפריימים, להשיג רינדור חלק ולשפר באופן משמעותי את מדדי תפקוד האפליקציה ב-Android‏ (מדד הסשנים האיטיים).

השקה של 'סשן איטי' ב'תפקוד האפליקציה'

סשן איטי הוא מדד של 'תפקוד האפליקציה' ב-Google Play Console. בסשן איטי יש יותר מ-25% פריימים איטיים. פריים נחשב לאיטי אם הוא:

1) בקצב של 20fps, היא לא מוצגת תוך 50 אלפיות השנייה אחרי המסגרת הקודמת. 2) בקצב של 30fps, הוא לא מוצג תוך 34 אלפיות השנייה אחרי המסגרת הקודמת.

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

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

מהו Swappy

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

הספרייה מטפלת במספר שיעורי רענון אם המכשיר תומך בהם, וכך נותנת למשחק יותר גמישות בהצגת פריים. לדוגמה, במכשיר שתומך בקצב רענון של 60Hz וגם של 90Hz, משחק שלא יכול להציג 60 פריימים לשנייה יכול לרדת ל-45FPS במקום ל-30FPS כדי לשמור על רמת חלקות גבוהה. הספרייה מזהה את קצב הפריימים הצפוי של המשחק ומתאימה באופן אוטומטי את זמני הצגת הפריימים בהתאם.

ספריית Frame Pacing משפרת גם את חיי הסוללה כי היא מונעת עדכוני מסך מיותרים. לדוגמה, אם המשחק נערך בקצב של 60FPS אבל המסך מתעדכן בקצב של 120Hz, המסך מתעדכן פעמיים לכל פריים. הספרייה Frame Pacing מונעת זאת על ידי הגדרת קצב הרענון לערך הקרוב ביותר לקצב הפריימים היעד, שתומך במכשיר.

איך Mir 2 שיפר את ביצועי הרינדור באמצעות Swappy

במשחק Mir 2‏ (미르2: 왕의 귀환) הייתה בעיה בביצועי העיבוד הלא יציבים, עם 40% סשנים איטיים ב-20FPS, גבוה בהרבה מהסף של 20% ב-Google Play.

איור 1. מדד הסשנים האיטיים לפני השילוב של Swappy.

Mir 2‏ (미르2: 왕의 귀환) הוא משחק עם גרפיקה באיכות גבוהה, וחלק מהמכשירים מתקשים לשמור על קצב פריימים יציב. התפלגות קצב הפריימים שלהם מראה שסשנים רבים פועלים בקצב פריימים נמוך מ-20fps.

איור 2. חלוקת ה-FPS במשחק לפני השילוב של Swappy.
כל קטגוריה מייצגת את אחוז הסשנים שבהם 75% מהפריימים שלהם היו מהירים יותר מהתוויות של הקטגוריות.

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

איור 3. פריים B ארוך גורם לקצב שגוי של 2 פריימים – A ו-B.

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

איור 4. המסגרות C ו-D ממתינות להצגה.

כדי לשלב את ספריית Swappy ב-Mir 2, השתמשו בתכונה המובנית של Unity, Optimized Frame Pacing. הפעולה הזו הביאה לשיפור משמעותי בביצועי הרינדור, במיוחד ירידה במדד 'סשנים איטיים' מ-40% ל-10%.

איור 5. שיפור של סשנים איטיים לאחר שילוב Swappy.

מספר הסשנים האיטיים ב-Mir2 ירד באופן משמעותי אחרי ששילבו את Swappy.

איור 6. חלוקת ה-FPS במשחק אחרי שילוב Swappy.
כל קטגוריה מייצגת את אחוז הסשנים שבהם 75% מהפריימים שלהם היו מהירים יותר מהתוויות של הקטגוריות.

תחילת השימוש ב-Swappy

איך משתמשים ב-Swappy במנועי משחקים מקומיים

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

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

ב-Unity שילבו את Android Frame Pacing במנוע שלהם. כדי להפעיל את התכונה הזו ב-Unity, מסמנים את התיבה Optimized Frame Pacing בקטע Project Settings (הגדרות הפרויקט)‏ > Player (נגן) > Settings for Android (הגדרות ל-Android)‏ > Resolution and Presentation (רזולוציה והצגה):

איור 7. מפעילים את Frame Pacing ב-Unity Engine.

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

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

Unreal 4.25 ואילך משלב את Android Frame Pacing Library, שנכללת ב-Android Game Development Kit. במאמר Mobile Frame Pacing מוסבר איך להפעיל את ספריית Android Frame Pacing ואיך לשלוט בקצב הפריימים מקוד C++‎.

למידע נוסף, אפשר לקרוא על סשנים איטיים ועל Swappy.