במכשיר אנדרואיד בינוני, GPU Profiler מציג 18 אלפיות השנייה לכל פריים מול יעד של 16.6 אלפיות השנייה — המשחק לא מצליח להחזיק 60 FPS. שילוב של 340 קריאות ציור (draw calls), אפקטים כבדים של overdraw, וטקסטורות 2048×2048 שתופסות על המסך 64×64 פיקסלים — כל גורם בנפרד נסבל, אבל יחד הם אסון.
מדוע אופטימיזציה מקיפה של גרפיקה למשחקי מובייל דורשת גישה כוללת?
מעבדי GPU במובייל הם מבוססי-טיילים (tile-based): הם מחלקים פריים לטיילים ומעבדים אותם ברצף. זה הופך אותם לרגישים ל-overdraw ולקצב מילוי (fill rate). בניגוד למעבדי GPU שולחניים במצב מיידי (immediate mode) שסולחים יותר, במובייל כל קריאת ציור נוספת או shader פיקסלים פוגעים בביצועים. אנחנו משלבים profiling, דחיסת טקסטורות, batching וכיוונון shaders לתהליך אחד — אחרת אין תוצאה.
איך מודדים ומפחיתים קריאות ציור?
קריאת ציור (Draw Call) היא פקודת CPU לעיבוד קבוצת משולשים עם הגדרות ספציפיות. כל קריאת ציור דורשת סנכרון CPU-GPU והעברת נתונים. במעבדי GPU מבוססי-טיילים במובייל (PowerVR, Mali, Adreno) זה יקר יותר מאשר במעבדי GPU שולחניים במצב מיידי.
כלים: Unity Profiler (GPU Usage), Frame Debugger, ולניתוח מעמיק RenderDoc באנדרואיד או Xcode Instruments ב-iOS. GPU Profiler בתוך העורך עצמו מציג את מספר ה-batches וקריאות SetPass. יעד טוב לפרויקטים במובייל הוא מתחת ל-100 קריאות ציור לפריים; ריאלי למשחקי mid-core הוא 150–200.
מקורות עיקריים לקריאות ציור מיותרות:
- Static Batching משלב אובייקטים סטטיים עם אותו חומר (Material) למש אחד בתחילת הסצנה. תנאי: האובייקטים חייבים להיות מסומנים כ-Static ב-Inspector ולהשתמש באותו קובץ Material — הגדרות זהות אבל Material Instance שונה לא עובד.
- GPU Instancing מתאים יותר להרבה עותקים של אותו אובייקט (עצים, סלעים, אויבים מאותו סוג). Dynamic Batching עובד אוטומטית לאובייקטים קטנים (מתחת ל-900 ורטיסים), אבל בפועל הוא מושבת לטובת Instancing. טכניקות batching של Unity חיוניות להפחתת קריאות ציור.
- מצב Canvas Overlay ב-uGUI: Canvas ב-Screen Space - Overlay מצויר מעל הכל, וכל שינוי בכל רכיב UI מסמן את כל ה-Canvas כ-Dirty, מחשב מחדש את הרשת ויוצר קריאת ציור נפרדת. ל-UI עם אלמנטים מונפשים, תמיד הפרידו אלמנטים סטטיים ודינמיים ל-Canvas שונים.
איך טקסטורות משפיעות על ביצועי משחקי מובייל?
מכשירי מובייל משתמשים בארכיטקטורת זיכרון מאוחדת (Unified Memory Architecture): GPU ו-CPU חולקים את אותו זיכרון. 512 MB RAM נפוץ במכשירי אנדרואיד תקציביים. טקסטורה לא דחוסה RGBA32 בגודל 2048×2048 = 16 MB. 10 טקסטורות כאלה ברמה = 160 MB רק לטקסטורות.
פורמטי דחיסה נתמכים בחומרה
| פורמט | ביטים לפיקסל | תמיכה |
|---|---|---|
| ETC2 ללא אלפא | 4 bpp | אנדרואיד, iOS (דרך ASTC?) |
| ETC2 עם אלפא | 8 bpp | אנדרואיד |
| ASTC 4×4 | 8 bpp | iOS, אנדרואיד (Adreno 400+, Mali G7x+) |
| ASTC 6×6 | 3.5 bpp | iOS, אנדרואיד (חדש יותר) |
| ASTC 8×8 | 2 bpp | iOS, אנדרואיד (דחיסה גבוהה) |
| DXT5 (BC3) | 8 bpp | PC |
ASTC הוא הבחירה הטובה ביותר ל-iOS ולאנדרואיד מודרני (סדרת Adreno 400+, Mali G7x ומעלה). במכשירי אנדרואיד ישנים עם OpenGL ES 2.0, ASTC לא נתמך — צריך fallback ל-ETC2. Unity מאפשרת פורמטים שונים לכל פלטפורמה דרך Texture Importer.
Mipmaps הם חובה לאובייקטים תלת-ממדיים, אבל לא נחוצים ל-UI. Mipmaps מוסיפים 33% לגודל הזיכרון, אבל עבור רכיבי UI שתמיד מצוירים ברזולוציה המקורית, זה בזבוז. בדקו דרך Texture Importer → Generate Mipmaps → השבתו לכל ה-Sprites של ה-UI.
מקרה אמיתי: פתרון בעיית OOM במכשירי מובייל
בפרויקט אחד — אסטרטגיית מובייל תלת-ממדית — המשחק קרס עם OOM במכשירים עם 512 MB RAM כשהתחיל קמפיין. Memory Profiler הראה 380 MB רק לטקסטורות. ביקורת גילתה: 60% מתקציב הטקסטורות נכבש על ידי טקסטורות שטח וסביבה בפורמט RGBA32 ללא דחיסה (המפתח כיבה דחיסה במהלך אב-טיפוס ושכח להחזיר), עוד 15% — טקסטורות UI עם mipmaps מופעלים. פתרון: המרת כל טקסטורות השטח/סביבה ל-ASTC 6×6, UI ל-ASTC 8×8 ללא mipmaps, לאפקטים עם אלפא — ASTC 4×4. תוצאה: 142 MB. קריסות ה-OOM נפסקו, 240 MB שוחררו ללוגיקת משחק ואודיו.מדוע overdraw קריטי במיוחד במעבדי GPU במובייל?
Overdraw הוא עיבוד אותו פיקסל מספר פעמים. חלקיקים שקופים למחצה, אפקטי post-processing מורכבים, רכיבי UI חופפים — כל אלה תורמים ל-overdraw. במעבדי GPU מבוססי-טיילים במובייל, overdraw יקר במיוחד: כל פעם שבuffer של טייל נקרא ונכתב שוב, זו עבודה נוספת.
המחישו overdraw ב-Unity: Scene View → Render Mode → Overdraw. אזורים לבנים מצביעים על בעיות. שימו לב במיוחד למערכות חלקיקים — חלקיקים לעתים קרובות מציירים עשרות quads שקופים אחד על השני באותה נקודה.
למערכות חלקיקים: הגבילו Max Particles, השתמשו ב-shaders אטומים או cutout היכן שמקובל ויזואלית (cutout יקר יותר בקצב מילוי אבל זול יותר בעומק overdraw), מיינו חלקיקים לפי Sorting Layer כדי למזער חפיפה עם גיאומטריה.
ל-shaders: shaders פשוטים מסוג Unlit זולים פי 3–5 מ-Lit במכשירי מובייל. לקישוטי רקע, צללי קרקע, אובייקטי billboard, Unlit מספיק. shader מסוג Lit עם תאורה per-pixel רק לאובייקטים קרובים ומרכזיים.
באילו כלים להשתמש ל-profiling?
התחילו עם Unity Profiler מחובר למכשיר דרך USB (Build → Development Build + Autoconnect Profiler). GPU Usage Profiler מציג זמן עיבוד לפי קטגוריה. Frame Debugger נותן פירוט מלא של קריאות ציור. Memory Profiler מספק תמונת מצב של זיכרון לפי קטגוריה.
בנוסף לאנדרואיד: Android GPU Inspector (AGI) למכשירי Adreno, Mali Performance Counters למעבדי Mali. הם מציגים ניצול קצב מילוי, רוחב פס טקסטורות ושיעור פגיעות מטמון — מדדים שלא זמינים ב-Unity Profiler. בדקו תמיכה ב-ASTC במכשיר דרך SystemInfo.SupportsTextureFormat(TextureFormat.ASTC_6x6).
תהליך אופטימיזציה שלב-אחר-שלב לאופטימיזציית FPS:
- בצעו profiling עם Unity Profiler ו-Frame Debugger כדי לזהות צווארי בקבוק.
- נתחו קריאות ציור: הפעילו static batching ו-GPU instancing.
- בצעו אופטימיזציה לטקסטורות: דחסו עם ASTC/ETC2, השביתו mipmaps ב-UI.
- הפחיתו overdraw: הגבילו חלקיקים, השתמשו ב-shaders אטומים.
- כוונו shaders: העדיפו Unlit על פני Lit היכן שאפשר.
- בדקו על מכשיר היעד; חזרו על התהליך אם צריך.
| משימה | משך | עלות (בקירוב) |
|---|---|---|
| ביקורת ביצועים + דוח עם המלצות | 2–5 ימים | $500–$1000 |
| אופטימיזציית טקסטורות וחומרים (סצנה בודדת) | 3–7 ימים | $1000–$2000 |
| אופטימיזציית גרפיקה מקיפה (פרויקט מלא) | 2–6 שבועות | $3000–$8000 |
| אופטימיזציה למכשיר מינימלי ספציפי | 1–3 שבועות | $2000–$4000 |
מה כלול בעבודת האופטימיזציה שלנו (תוצרים):
- ביקורת ביצועים מפורטת עם דוח מלא והמלצות
- דחיסה מחדש של טקסטורות עם בחירת פורמט אופטימלי לכל פלטפורמה
- הגדרת batching, instancing ו-shaders
- Profiling וסילוק צווארי בקבוק (קריאות ציור, overdraw, זיכרון)
- תיעוד השינויים וגישה לקבצי הפרויקט המאופטמים
- הדרכה לצוות הלקוח על שיטות עבודה מומלצות
- אחריות לתוצאה: FPS ויציבות במכשירי היעד
יש לנו ניסיון של למעלה מ-5 שנים באופטימיזציית משחקי מובייל והשלמנו 20+ פרויקטים ב-Unity ו-Unreal Engine. צרו קשר לביקורת על הפרויקט שלכם. הזמינו אופטימיזציה וקבלו FPS יציב במכשירי היעד.
מפתחי אנדרואיד: דחיסת טקסטורות ASTC - developer.android.com/games/optimize/astc





