במדריך הזה מוסבר איך לנתח את ביצועי המשחק במכשירי Android ולבצע אופטימיזציה שלהם כדי לספק חוויית משתמש חלקה. המאמר כולל הסברים על זיהוי צווארי בקבוק בביצועים, על הבחנה בין בעיות שקשורות למעבד לבין בעיות שקשורות ל-GPU ועל אימות תוצאות האופטימיזציה.
לא משנה כמה המשחק מהנה או מעניין, אם הוא לא פועל בצורה טובה במכשירים ניידים, השחקנים לא ייהנו ממנו והוא לא יהיה מוצלח. גם במשחקים מהנים יכולות להיות בעיות כמו קצב פריימים נמוך (FPS) או התחממות יתר של המכשיר. הבעיות האלה גורמות לחוסר שביעות רצון בקרב השחקנים. לכן, חשוב לשפר את ביצועי המשחק, ואתם צריכים להבין איך לבצע אופטימיזציה.
תהליך האופטימיזציה של הביצועים כולל את השלבים הבאים:
מדידת הביצועים הכוללים של המשחק. כדי לזהות אנומליות, צריך לכמת את הירידה בביצועים ברמת הסצנה.
בדיקה של מגבלות CPU ו-GPU. לברר מהו הגורם הבסיסי, בין אם הוא קשור ל-CPU או ל-GPU.
כלים: Unreal Insight, Unity Profiler, Perfetto וכלים למדידת ביצועים.
אופטימיזציה של CPU. לפתור את צווארי הבקבוק בביצועים שזוהו.
כלים: Unreal Insight, Unity Profiler, Perfetto ו-Simpleperf.
אופטימיזציה של GPU. לפתור את צווארי הבקבוק בביצועים שזוהו.
כלים: RenderDoc, Arm mobile studio, AGI, כלי ספציפי לספק.
בדיקות A/B. כדאי לבצע בדיקות A/B כדי לוודא שהאופטימיזציות שהטמעתם יעילות.
כלים: Unreal Insight, Unity Profiler, Perfetto וכלים למדידת ביצועים, נעילת תדר של CPU או GPU ו-RenderDoc.
התהליך האיטרטיבי הזה (1-5) נמשך עד שמגיעים בהצלחה לפרמטרים של FPS וטמפרטורה.
דרישות מוקדמות
גרסת build של משחק שמוכנה לבדיקה במכשיר עם מערכת הפעלה Android.
מתקינים את הכלים הבאים:
ניתוח מקיף של ביצועי המשחק
צריך לבדוק את הביצועים הכוללים של המשחק ולזהות חריגות או ירידה בביצועים שמבוססות על סצנות. לפני שמבצעים אופטימיזציה למשחק, כדאי לבדוק את הביצועים הנוכחיים שלו. במשחקים יש הרבה ממשקי משתמש וסצנות, ולכן כדאי לנתח סצנות עם שימוש גבוה במעבד או במעבד הגרפי, או פריסות עם ביצועים לא צפויים, כדי לעקוב אחרי ירידה בביצועים וניצול המעבד או המעבד הגרפי בכל סצנה.
- כמותית: כדאי להשתמש בכלי מדידת ביצועים כדי למדוד את הביצועים הכוללים של המשחק. מדידת הביצועים ברמת הסצנה כדי לזהות אזורים ספציפיים עם ירידה באיכות או חריגות.
- זיהוי סצנות בעייתיות: ניתוח הנתונים כדי למצוא סצנות עם שימוש גבוה ב-CPU או ב-GPU, או סצנות שבהן פריסות המסך לא מניבות את הביצועים הצפויים.
- איסוף נתוני מעקב: משתמשים בכלי מעקב כדי לאסוף נתוני ביצועים מפורטים עבור הסצנות הבעייתיות שזוהו.
זיהוי צווארי בקבוק במעבד או ב-GPU
אם המשחק לא מגיע ליעד של FPS, צריך לבדוק אם הוא מוגבל על ידי המעבד או על ידי המעבד הגרפי. ניתוח ההתנהגות של המעבד (CPU) והמעבד הגרפי (GPU) חיוני כדי למצוא הזדמנויות לאופטימיזציה, גם כשהמכשיר מתחמם או משתמש ביותר מדי חשמל במהלך משחק. יש כמה שיטות לבדוק אם המערכת מוגבלת על ידי המעבד או על ידי המעבד הגרפי.
ניתוח נתוני מעקב: משתמשים בכלי המועדף כדי לנתח את נתוני המעקב:
- Unreal Insight (Unreal Engine): ניתוח של הנתונים כדי לראות את התזמון של
GameThread,RenderThreadו-RHIThread.- אם הערכים של
GameThreadאוRenderThreadחורגים ממגבלת זמן רינדור הפריים (לדוגמה, 33.3 אלפיות השנייה ל-30 FPS), המשחק מוגבל על ידי המעבד. - אם
RHIThreadמציג הרצה ממושכת או מהווה את רוב זמן רינדור פריים, המשחק מוגבל על ידי GPU.
- אם הערכים של
איור 2. מעקב אחר תובנות ב-Unreal עם GameThread, RenderThread ו-RHIThread (לוחצים להגדלה). - Unity Profiler (Unity): אם ה-main thread צורך זמן משמעותי בסמנים כמו
Gfx.WaitForPresentOnGfxThreadבזמן ש-render thread מציגGfx.PresentFrameאו<GraphicsAPIName>.WaitForLastPresent, המשחק הוא GPU-bound.
איור 3. דוגמה ל-GPU bound ב-Unity Profiler (כדי להגדיל את התמונה, לוחצים עליה). - Perfetto: ניתוח של הקצאות ליבות CPU ופרטי ביצוע של שרשורים. הניתוח הזה מאפשר לזהות צווארי בקבוק בביצועים באמצעות בדיקה מפורטת של מידע על ביצוע השרשור.
תקורה של CPU: הנתונים במעקב מצביעים על כך שעומס העבודה ב-
GameThreadוב-RenderThread, בשילוב עם VSync, אחראי לעיכובים ב-QueuePresentשל RHI Thread, ולכן מדובר בתרחיש שמוגבל על ידי CPU.
איור 4. עקבות Perfetto עם פרטים על הביצוע במעבד (אפשר ללחוץ כדי להגדיל). תקורה של GPU: אם זמן ההשלמה של ה-GPU חורג ממגבלת זמן רינדור פריים, למשל 25 אלפיות השנייה, המשחק מוגבל על ידי ה-GPU. הנתונים במעקב מצביעים על כך שהשלמת ה-GPU חורגת מ-25 אלפיות השנייה, מה שמצביע על תרחיש שמוגבל על ידי ה-GPU.
איור 5. עקבות Perfetto עם פרטים על תקורה של GPU (אפשר ללחוץ כדי להגדיל).
- Unreal Insight (Unreal Engine): ניתוח של הנתונים כדי לראות את התזמון של
שימוש בפקודות סטטוס של Unreal Engine:
-
stat unit: השוואה בין הזמן שהוקצה לשרשורים של המשחק, הציור וה-RHI. אם זמני המשחק והציור נמוכים, אבל הזמן של RHI חורג באופן עקבי ממגבלת זמן רינדור פריים, המשחק מוגבל על ידי GPU. לדוגמה, אם קצב הפריימים הנדרש הוא 30 (שווה ערך ל-33.33 אלפיות השנייה לכל פריים), ושני השרשורים של המשחק והציור נשארים באופן עקבי בטווח של 10-15 אלפיות השנייה, אבל ה-RHI חורג באופן עקבי מ-30 אלפיות השנייה, זה מצביע על תרחיש שמוגבל על ידי ה-GPU.
איור 6. יחידת הסטטיסטיקה מאפשרת להעריך תנאים שמוגבלים על ידי GPU. -
stat VulkanRHI: בודקים את משך הזמן של Queue Submit ו-Queue Present.
איור 7. Stat VulkanRHI מאפשר להעריך תנאים שמוגבלים על ידי GPU (אפשר ללחוץ כדי להגדיל). -
stat slow: בודקים את הזמן שהוקצה לשרשורים של Game, Render ו-RHI כדי לזהות את הגורמים המעכבים.
-
בדיקת מדדי הביצועים: אפשר להשתמש בתוצאות של ניתוח הביצועים המקיף של המשחק. ב-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.
אימות היעילות של האופטימיזציה
- עורכים בדיקות A/B: יוצרים גרסת build עם האופטימיזציות שהוטמעו.
- מדידת הביצועים: משתמשים באותם כלים ושיטות מהניתוח הראשוני כדי למדוד את הביצועים של הגרסה שעברה אופטימיזציה.
- השוואת התוצאות: משווים את נתוני הביצועים החדשים לנתונים הראשוניים כדי לוודא שהצווארי בקבוק שזוהו נפתרו ושהיעדים של FPS ושל הטמפרטורה הושגו.
- איטרציה: חוזרים על שלבי הניתוח והאופטימיזציה עד שמגיעים לביצועים הרצויים.