שימוש בזיכרון של מפת הסיביות (bitmap)

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

גורמים לשימוש גבוה בזיכרון של מפת הסיביות

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

משאבים

ניתוח מפות ביט ב-Android Studio

פרופיל של מפות סיביות ב-Android Studio

אפשר להשתמש בכלי Memory Profiler כדי לבדוק הקצאות זיכרון בזמן אמת, לצלם תמונות מצב של הזיכרון ולנתח אובייקטים כדי לזהות דליפות זיכרון. בנוסף, אפשר להשתמש בכלי Heap Analyzer כדי לזהות דליפות זיכרון, לזהות הקצאות כפולות של מפות סיביות ולהציג חזותית את השמירה של אובייקטים.

זיהוי אוטומטי של דליפות זיכרון באמצעות LeakCanary

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

מסמכי תיעוד בנושא ביצועים של מפת סיביות (bitmap)

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

רשימת משימות למפתחים לאופטימיזציה של השימוש בזיכרון של מפת הסיביות (bitmap)

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

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

רשימת המשימות הבאה למפתחים יכולה לעזור לכם לבצע אופטימיזציה של השימוש בזיכרון של מפת הסיביות (bitmap).

עקרון מרכזי אזור תיאור
הפחתה הסרת מפות סיביות כפולות כדי לזהות הקצאות מיותרות של מפות סיביות, אפשר לנתח תמונות מצב של הזיכרון באמצעות הכלי Memory Profiler. אפשר לעיין במדריך בנושא ניהול זיכרון של מפת סיביות.
שימוש בספריות לטעינת תמונות מומלץ להשתמש בספריות כמו Glide ו-Coil כדי להפוך את השרשור, השמירה במטמון והפענוח היעיל לאוטומטיים.
הטמעה של דגימה מצומצמת פענוח תמונות כדי להתאים למידות של מאגר רכיבי ממשק המשתמש של היעד במקום לטעון נכסים ברזולוציה מלאה.
שימוש ב-RGB_565 לתמונות אטומות הקטנת הזיכרון שבשימוש ב-50% על ידי מעבר מ-ARGB_8888 להגדרה של 16 ביט לתמונות ללא שקיפות.
עדיפות ל-VectorDrawables כדי להבטיח שינוי גודל חד עם תקורה מינימלית של זיכרון, מומלץ להשתמש בווקטורים לסמלים ולגרפיקה בסיסית.
אופטימיזציה של שליחת תמונות מצד השרת הגדרת ממשקי API של קצה עורפי כדי להציג תמונות שמותאמות לצפיפות הפיקסלים במכשיר ולמידות של מאגרי רכיבי ממשק המשתמש.
הסרת שוליים שקופים כדי להימנע מהקצאת זיכרון לפיקסלים 'בלתי נראים', כדאי להשתמש ב-InsetDrawable או במרווחים פנימיים של פריסה במקום במרווחים קבועים. מידע נוסף על תכנון אפליקציות ל-Android עם ביצועים טובים של זיכרון
שימוש חוזר הגדרת גדלי מטמון אופטימליים התאמה של מגבלות הזיכרון והמטמון בדיסק בהתאם לזיכרון ה-RAM ולרזולוציית המסך של המכשיר. אפשר להיעזר במאמר בנושא שמירה במטמון של מפות סיביות.
מיחזור מחיקת משאבים ברקע הטמעה של TRIM_MEMORY_BACKGROUND כדי לנקות מטמונים ולשפר את היכולת של התהליך לשרוד במהלך לחץ על זיכרון המערכת.
שחרור נכסים כשהממשק מוסתר משתמשים ב-TRIM_MEMORY_UI_HIDDEN כדי לשחרר מטמון של מפות סיביות כשהאפליקציה לא גלויה יותר למשתמש.
מעקב אחרי דליפות זיכרון אפשר להשתמש ב-LeakCanary וב-Memory Profiler כדי למצוא מפות סיביות שנשמרו אחרי שה-LifecycleOwner שלהן נהרס. מידע נוסף מפורט במאמר בנושא ניהול הזיכרון של האפליקציה.