ניתוח ואופטימיזציה של ביצועי המשחק

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

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

תהליך האופטימיזציה של הביצועים כולל את השלבים הבאים:

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

  2. בדיקה של מגבלות CPU ו-GPU. לברר מהו הגורם הבסיסי, בין אם הוא קשור ל-CPU או ל-GPU.

    כלים: Unreal Insight,‏ Unity Profiler,‏ Perfetto וכלים למדידת ביצועים.

  3. אופטימיזציה של CPU. לפתור את צווארי הבקבוק בביצועים שזוהו.

    כלים: Unreal Insight,‏ Unity Profiler,‏ Perfetto ו-Simpleperf.

  4. אופטימיזציה של GPU. לפתור את צווארי הבקבוק בביצועים שזוהו.

    כלים: RenderDoc, ‏ Arm mobile studio, ‏ AGI, כלי ספציפי לספק.

  5. בדיקות A/B. כדאי לבצע בדיקות A/B כדי לוודא שהאופטימיזציות שהטמעתם יעילות.

    כלים: Unreal Insight,‏ Unity Profiler,‏ Perfetto וכלים למדידת ביצועים, נעילת תדר של CPU או GPU ו-RenderDoc.

  6. התהליך האיטרטיבי הזה (1-5) נמשך עד שמגיעים בהצלחה לפרמטרים של FPS וטמפרטורה.

דרישות מוקדמות

ניתוח מקיף של ביצועי המשחק

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

  1. כמותית: כדאי להשתמש בכלי מדידת ביצועים כדי למדוד את הביצועים הכוללים של המשחק. מדידת הביצועים ברמת הסצנה כדי לזהות אזורים ספציפיים עם ירידה באיכות או חריגות.
  2. זיהוי סצנות בעייתיות: ניתוח הנתונים כדי למצוא סצנות עם שימוש גבוה ב-CPU או ב-GPU, או סצנות שבהן פריסות המסך לא מניבות את הביצועים הצפויים.
  3. איסוף נתוני מעקב: משתמשים בכלי מעקב כדי לאסוף נתוני ביצועים מפורטים עבור הסצנות הבעייתיות שזוהו.

זיהוי צווארי בקבוק במעבד או ב-GPU

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

  1. ניתוח נתוני מעקב: משתמשים בכלי המועדף כדי לנתח את נתוני המעקב:

    • Unreal Insight (Unreal Engine): ניתוח של הנתונים כדי לראות את התזמון של GameThread, RenderThread ו-RHIThread.
      • אם הערכים של GameThread או RenderThread חורגים ממגבלת זמן רינדור הפריים (לדוגמה, 33.3 אלפיות השנייה ל-30 FPS), המשחק מוגבל על ידי המעבד.
      • אם RHIThread מציג הרצה ממושכת או מהווה את רוב זמן רינדור פריים, המשחק מוגבל על ידי GPU.
    ציר זמן של מעקב Unreal Insight שמציג את זמני הביצוע של GameThread,‏ RenderThread ו-RHIThread
    איור 2. מעקב אחר תובנות ב-Unreal עם GameThread,‏ RenderThread ו-RHIThread (לוחצים להגדלה).
    • Unity Profiler (Unity): אם ה-main thread צורך זמן משמעותי בסמנים כמו Gfx.WaitForPresentOnGfxThread בזמן ש-render thread מציג Gfx.PresentFrame או <GraphicsAPIName>.WaitForLastPresent, המשחק הוא GPU-bound.
    ציר הזמן של Unity Profiler שבו מוצגת ההמתנה של פרוטוקול Thread הראשי ל-Gfx.WaitForPresentOnGfxThread
    איור 3. דוגמה ל-GPU bound ב-Unity Profiler (כדי להגדיל את התמונה, לוחצים עליה).
    • Perfetto: ניתוח של הקצאות ליבות CPU ופרטי ביצוע של שרשורים. הניתוח הזה מאפשר לזהות צווארי בקבוק בביצועים באמצעות בדיקה מפורטת של מידע על ביצוע השרשור.
    • תקורה של CPU: הנתונים במעקב מצביעים על כך שעומס העבודה ב-GameThread וב-RenderThread, בשילוב עם VSync, אחראי לעיכובים ב-QueuePresent של RHI Thread, ולכן מדובר בתרחיש שמוגבל על ידי CPU.

      עקבות Perfetto שמציגות את זמני ההפעלה של GameThread,‏ RenderThread ו-RHIThread
      איור 4. עקבות Perfetto עם פרטים על הביצוע במעבד (אפשר ללחוץ כדי להגדיל).
    • תקורה של GPU: אם זמן ההשלמה של ה-GPU חורג ממגבלת זמן רינדור פריים, למשל 25 אלפיות השנייה, המשחק מוגבל על ידי ה-GPU. הנתונים במעקב מצביעים על כך שהשלמת ה-GPU חורגת מ-25 אלפיות השנייה, מה שמצביע על תרחיש שמוגבל על ידי ה-GPU.

      עקבות Perfetto שמציגות בלוק של השלמת GPU בהמתנה להשלמת GPU
      איור 5. עקבות Perfetto עם פרטים על תקורה של GPU (אפשר ללחוץ כדי להגדיל).
  2. שימוש בפקודות סטטוס של Unreal Engine:

    • stat unit: השוואה בין הזמן שהוקצה לשרשורים של המשחק, הציור וה-RHI. אם זמני המשחק והציור נמוכים, אבל הזמן של RHI חורג באופן עקבי ממגבלת זמן רינדור פריים, המשחק מוגבל על ידי GPU. לדוגמה, אם קצב הפריימים הנדרש הוא 30 (שווה ערך ל-33.33 אלפיות השנייה לכל פריים), ושני השרשורים של המשחק והציור נשארים באופן עקבי בטווח של 10-15 אלפיות השנייה, אבל ה-RHI חורג באופן עקבי מ-30 אלפיות השנייה, זה מצביע על תרחיש שמוגבל על ידי ה-GPU.
    שכבת-על של יחידת נתונים סטטיסטיים שמציגה את זמני הביצוע של Frame,‏ Game,‏ Draw,‏ GPU ו-RHIT
    איור 6. יחידת הסטטיסטיקה מאפשרת להעריך תנאים שמוגבלים על ידי GPU.
    • stat VulkanRHI: בודקים את משך הזמן של Queue Submit ו-Queue Present.
    שכבת-על של Stat VulkanRHI שמציגה מוני מחזורים עבור Queue Submit ו-Queue Present
    איור 7. ‫Stat VulkanRHI מאפשר להעריך תנאים שמוגבלים על ידי GPU (אפשר ללחוץ כדי להגדיל).
    • stat slow: בודקים את הזמן שהוקצה לשרשורים של Game,‏ Render ו-RHI כדי לזהות את הגורמים המעכבים.
  3. בדיקת מדדי הביצועים: אפשר להשתמש בתוצאות של ניתוח הביצועים המקיף של המשחק. ב-Android:

    • מוגבל על ידי CPU: שימוש ב-CPU (מנורמל) גבוה מ-15%, עם שימוש נמוך ב-GPU ו-FPS נמוך.
    • מוגבל על ידי GPU: השימוש ב-GPU גדול מ-90%.

    בדרך כלל, אם קצב הפריימים לשנייה (FPS) והשימוש ב-GPU נמוכים, והשימוש במעבד (CPU) חורג מ-15%, המצב נחשב כהגבלה של המעבד.

    טבלאות של מדדי ביצועים שמדגישות תרחישים שמוגבלים על ידי המעבד ותרחישים שמוגבלים על ידי המעבד הגרפי
    איור 8. מדדי ביצועים עם נתוני שימוש ב-CPU וב-GPU.

אופטימיזציה של ביצועי המעבד

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

הוראות מפורטות זמינות במאמר טיפים לאופטימיזציה של CPU ו-GPU ל-Android.

אופטימיזציה של ביצועי ה-GPU

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

הוראות מפורטות זמינות במאמר טיפים לאופטימיזציה של CPU ו-GPU ל-Android.

אימות היעילות של האופטימיזציה

  1. עורכים בדיקות A/B: יוצרים גרסת build עם האופטימיזציות שהוטמעו.
  2. מדידת הביצועים: משתמשים באותם כלים ושיטות מהניתוח הראשוני כדי למדוד את הביצועים של הגרסה שעברה אופטימיזציה.
  3. השוואת התוצאות: משווים את נתוני הביצועים החדשים לנתונים הראשוניים כדי לוודא שהצווארי בקבוק שזוהו נפתרו ושהיעדים של FPS ושל הטמפרטורה הושגו.
  4. איטרציה: חוזרים על שלבי הניתוח והאופטימיזציה עד שמגיעים לביצועים הרצויים.

למידע נוסף