הקטנת המשחק

במאמר הזה נסביר איך להקטין את הגודל של משחק. אחרי ההתקנה, משחק קטן יותר דורש פחות זמן להורדה ופחות נתונים. שתי האפשרויות האלה מובילות להמרות גבוהות יותר של התקנות. מחקר של Google מראה שעלייה של 6 MB בגודל של קובץ ה-APK שמוצג מובילה לירידה של 1% בשיעור ההתקנה. מפתחים רבים מעבירים נכסים מקובץ ה-APK לרשת להעברת תוכן (CDN), אבל אז הם נדרשים לשלם על אירוח ה-CDN ועל פיתוח ותחזוקה של מערכת ניהול הנכסים.

כדי להקטין את הגודל של משחק, פועלים לפי השלבים הבאים:

  1. שימוש בשיטות אופטימליות להעברת נתונים, כמו חבילות אפליקציות ו-Play Asset Delivery.
  2. קובעים את גודל הבסיס של המשחק ומבינים את המבנה שלו.
  3. חיפוש נכסים וקבצים אחרים שאפשר להקטין את הגודל שלהם.
  4. בודקים את מרקמי הגרפיקה ומזהים הזדמנויות לאופטימיזציה.
  5. פועלים לפי ההמלצות הכלליות לגבי נכסים.

שימוש בשיטות אופטימליות להעברת נתונים, כמו Android App Bundles ו-Play Asset Delivery

אפשר לבחור מבין שיטות המסירה הבאות:

  • בדרך כלל, פרויקטים מדור קודם יוצרים קובץ APK לפרסום, אבל כשמפרסמים משחקים ב-Google Play צריך להשתמש ב-Android App Bundle. חבילות App Bundle מספקות קובצי APK שעברו אופטימיזציה ומותאמים לתצורת המכשיר של כל משתמש. בממוצע, קובצי App Bundle מקטינים את גודל האפליקציה ב-20%.

  • כדי להציג נכסי משחקים דרך Google Play ולחרוג ממגבלת גודל ההורדה של 200MB ל-App Bundle עד לכמה GB, צריך להשתמש ב-Play Asset Delivery‏ (PAD). אין צורך ב-CDN חיצוני. ‫PAD תומך בשלוש שיטות שונות להצגת מודעות, וכל אחת מהן יכולה לשמש במשחק יחיד:

    • בזמן ההתקנה: הורדת נכסים בזמן ההתקנה. הנכסים נארזים בחבילות נכסים, שמחליפות את קובצי ה-OBB (Opaque Binary Blob).
    • הורדה מהירה: הורדת נכסים אחרי ההתקנה.
    • על פי דרישה: המשחק מתחיל להוריד נכסים לפי הצורך.

    ב-PAD נדרש לארוז את המשחקים בפורמט App Bundle. בנוסף, PAD יכול להפחית את כמות הנתונים שמשמשים את ה-CDN של מפתח (אם עדיין יש צורך ב-CDN).

  • מערכת Google Play משתמשת בקובצי Android App Bundle כדי ליצור חבילות APK שעברו אופטימיזציה ולהציג אותן לכל משתמש בהתאם לתצורת המכשיר שלו. חבילות ה-APK האופטימליות האלה כוללות קבוצה אחת של נכסי טקסטורה, בפורמט הדחיסה האופטימלי למכשיר. כדי לתמוך במגוון רחב של מכשירים, צריך להגדיר את ה-App Bundle כך שיתמוך בפורמטים שונים של דחיסת טקסטורות.

קביעת גודל הבסיס של המשחק והבנת המבנה שלו

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

  1. משתמשים בגרסת ייצור (לא גרסת ניפוי באגים) של האפליקציה שנוצרה על ידי המפתח או בחבילת ה-APK שפורסמה.
  2. מתעדים את הגודל של קובץ הבינארי כפי שהוא נמסר על ידי המפתח, או אם המשחק פורסם, בדף של המשחק בחנות Play. בנוגע לגודל ה-APK, הגורם החשוב ביותר הוא כמות הנתונים שהמשתמש צריך להוריד כדי להפעיל את המשחק בפועל.
  3. מתקינים את המשחק במכשיר ומפעילים אותו כדי להגיע לתפריט המשחק הראשוני. בשלב הזה, בודקים את גודל ההתקנה של המשחק כפי שמדווח ב-Android (בקטע הגדרות > אחסון). לחלק מהמשחקים יש גודל התקנה ראשוני קטן, כי זה המספר העיקרי שצריך לבצע אופטימיזציה לגביו, אבל הם מורידים נתונים נוספים אחרי ההתקנה. חלק מהמשחקים מורידים כמה גיגה-בייט של נתונים אחרי ההתקנה.
  4. חלק מהמשחקים מורידים נתונים רק אחרי שמתחילים לשחק בהם. כדאי לשחק קצת במשחק כדי לראות כמה נתונים נוספים המשחק מוריד עבור משתמש טיפוסי שמשחק בו בפעם הראשונה.

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

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

כדי להקטין את הגודל של קבצים שנארזים ישירות ב-APK, מבצעים את השלבים הבאים:

  1. משתמשים בכלי לניתוח APK ב-Android Studio. ב-Android Studio, בוחרים באפשרות File > Profile or debug APK (קובץ > פרופיל או ניפוי באגים של APK) ובוחרים את קובץ ה-APK.
  2. בוחרים בתיקייה נכסים. לכל קובץ מפורטים הגודל של הקובץ הגולמי והאחוז מתוך הגודל הכולל של ההורדה.
  3. בודקים את התיקייה Assets (נכסים) ומחליטים איפה נמצאים רוב הנתונים של המשחק. בודקים אם יש נכסים שתופסים נפח אחסון גדול מדי (כלומר, יותר מ-1% מהנפח הכולל). בפרט, כדאי לחפש את הדברים הבאים:

    • קבצים גדולים של תמונות וסרטונים (לדוגמה, קובצי PNG‏, JPEG ו-mp4): הקבצים האלה משמשים בדרך כלל במסכי פתיחה, ברקעים ובלוגו. ברוב המשחקים, הקבצים האלה לא נמצאים בשימוש לעיתים קרובות, ואפשר לדחוס אותם עוד יותר בלי לפגוע בחוויית המשתמש. קובצי PNG ללא אובדן נתונים הם גדולים במיוחד, ולכן הם מועמדים מצוינים לדחיסה.
    • קבצי גופן גדולים (לדוגמה, קובצי TTF): אם מוסיפים תמיכה באימוג'י, גודל קובץ הגופן יכול לגדול באופן משמעותי. אם קובץ הגופן גדול מכמה מאות קילובייט, כדאי לחשוב על דרכים להקטין את הגודל שלו.
    • פורמטים או גרסאות כפולות של קובצי אודיו שאפשר לשלב.
  4. אם קובץ ה-APK כולל כמה ממשקי יישום בינאריים (ABI), צריך לעבור לשימוש בקובצי App Bundle או ליצור כמה קובצי APK.

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

  6. בודקים את קובץ המניפסט של Android כדי לראות אילו פורמטים של גרפיקה נתמכים. בודקים אם יש כמה תגי <supports-gl-texture> ב-APK. אם המשחק תומך בפורמטים של כמה יחידות GPU בקובץ APK אחד, כדאי להשתמש ב-Binomial's Basis Universal. מערכת הדחיסה הזו של טקסטורות ב-GPU יוצרת קובצי טקסטורה בפורמט ביניים שאפשר לבצע בו טרנסקוד מהיר ל-GPU.

בודקים את טקסטורות הגרפיקה ומזהים הזדמנויות לאופטימיזציה

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

כדי לבדוק את הטקסטורות במשחק, אפשר להשתמש ב-Android GPU Inspector ‏(AGI), ב-RenderDoc או ב-Snapdragon Profiler (רק למעבדי GPU מסוג Qualcomm Snapdragon).

מחפשים את הדברים הבאים:

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

  • אם עדיין לא עשיתם זאת, כדאי לבדוק את קובץ המניפסט של Android כדי לראות אילו פורמטים של גרפיקה נתמכים. בודקים אם יש כמה תגי <supports-gl-texture> בחבילת ה-APK. אם המשחק תומך בפורמטים של כמה יחידות GPU בקובץ APK אחד, כדאי להשתמש ב-Binomial's Basis Universal. מערכת הדחיסה הזו של טקסטורות ב-GPU יוצרת קובצי טקסטורה בפורמט ביניים שאפשר לבצע בו טרנסקוד מהיר ל-GPU.

המלצות כלליות לגבי נכסים דיגיטליים

ההמלצות הבאות מתייחסות לנכסים דיגיטליים של קובץ APK:

  • נכסי תמונה, אודיו ווידאו (לא טקסטורות של GPU): בודקים אם אפשר לשנות את הגודל של הנכסים או לדחוס אותם עוד יותר. בדרך כלל מקובל להשתמש במשחקים ביחסי דחיסה גבוהים יותר. קבצים בפורמט PNG ללא אובדן נתונים הם גדולים במיוחד, ולכן הם מועמדים מצוינים לדחיסה.
  • נכסי תמונות (לא טקסטורות של GPU): כדאי להשתמש ב-WEBP, פורמט דחיסת תמונות לדחיסה עם אובדן נתונים ולדחיסה ללא אובדן נתונים. דחיסה עם אובדן נתונים בפורמט WEBP דוחסת תמונות ב-25% עד 34% יותר מאשר בפורמט JPG.
  • הקטנת רזולוציית הטקסטורה: שימוש בטקסטורה גדולה בהרבה ממספר הפיקסלים שמוצגים בסופו של דבר על המסך הוא שימוש לא יעיל במקום ובמשאבי ה-GPU. כדי לשנות טקסטורה ולראות איך היא נראית בפריים בלי לבנות מחדש את המשחק, משתמשים ב-AGI.
  • שינוי פורמטים של טקסטורות בגרפיקה: שימוש בפורמטים של טקסטורות שמשתמשים בפחות ביטים לכל ערוץ. לדוגמה, כדאי להשתמש בפורמט מרקם של 16 ביט כמו RGB565 במקום בפורמט מרקם של 32 ביט כמו ARGB. מידע נוסף זמין במאמרים הבאים:

מקורות מידע נוספים