بیتمپها اغلب بزرگترین اشیاء مصرفکننده حافظه در یک برنامه هستند. عملیات رمزگشایی و مقیاسبندی اغلب در مسیر بحرانی رندر فریم قرار دارند. بهینهسازی استفاده از حافظه بیتمپ با کاهش jank، ANR و توقفهای فرآیند مربوط به OOM، پیشرفتهای قابل توجهی در پاسخگویی رابط کاربری، عمر باتری و پایداری کلی ایجاد میکند.
عوامل مؤثر در استفاده زیاد از حافظه بیتمپ
حافظه مجازی که هرگز استفاده نشده است نیز ممکن است در محاسبه لحاظ شود. اگر به طور غیرمنتظرهای شاهد استفاده زیاد از حافظه بیتمپ بودید، بررسی کنید که حافظهای را که استفاده نشده است، اختصاص نمیدهید.
منابع
تحلیل بیتمپها در اندروید استودیو
پروفایلینگ اندروید استودیو برای بیتمپها
از Memory Profiler برای بررسی تخصیص حافظه به صورت بلادرنگ، ثبت دادههای هیپ و تجزیه و تحلیل اشیاء برای یافتن نشتی حافظه استفاده کنید؛ علاوه بر این، از Heap Analyzer برای تشخیص نشتی حافظه، شناسایی تخصیصهای بیتمپ تکراری و تجسم حفظ اشیاء استفاده کنید.
تشخیص خودکار نشت با LeakCanary
کتابخانه LeakCanary را برای خودکارسازی تشخیص نشت حافظه در برنامه خود ادغام کنید. LeakCanary تجزیه و تحلیل خودکار پشته را ارائه میدهد و اشیایی را که باید جمعآوری زباله میشدند اما هنوز در حافظه نگهداری میشوند، مانند بیتمپهایی که توسط اجزای تخریب شده نگهداری میشوند، شناسایی میکند.
مستندات عملکرد بیتمپ
این منابع راهنمایی جامعی در مورد بهترین شیوهها برای مدیریت کارآمد بیتمپ در اجزای مختلف اندروید ارائه میدهند.
چک لیست توسعهدهندگان برای بهینهسازی استفاده از حافظه بیتمپ
برای بهینهسازی کارایی حافظه بیتمپ، سه اصل اساسی را دنبال کنید: کاهش، استفاده مجدد و بازیافت.
- کاهش : هنگام بارگذاری یا نمایش بیتمپها، میزان حافظه اولیه را به حداقل میرساند.
- استفاده مجدد : پیادهسازی مکانیزمهای ذخیرهسازی موقت برای جلوگیری از تخصیصهای تکراری بیتمپ.
- بازیافت : منابع را به صورت پیشگیرانه آزاد میکند تا امکان تخصیص مجدد حافظه برای فرآیندهای فعال فراهم شود.
چک لیست توسعهدهندگان زیر میتواند به شما در بهینهسازی استفاده از حافظه بیتمپ کمک کند.
| اصل اساسی | مساحت | توضیحات |
|---|---|---|
| کاهش | حذف بیتمپهای تکراری | با استفاده از Memory Profiler، دادههای هیپ دامپ را تجزیه و تحلیل کنید تا تخصیصهای بیتمپ اضافی را شناسایی کنید. به راهنمای مدیریت حافظه بیتمپ مراجعه کنید. |
| استفاده از کتابخانههای بارگذاری تصویر | از کتابخانههایی مانند Glide و Coil برای خودکارسازی threading، caching و decoding کارآمد استفاده کنید. | |
| پیادهسازی نمونهبرداری کاهشی | به جای بارگذاری فایلهای با وضوح کامل، تصاویر را طوری رمزگشایی کنید که با ابعاد کانتینر رابط کاربری هدف مطابقت داشته باشند. | |
| برای تصاویر مات از RGB_565 استفاده کنید | با تغییر از ARGB_8888 به پیکربندی ۱۶ بیتی برای تصاویر بدون شفافیت، میزان مصرف حافظه را تا ۵۰٪ کاهش دهید. | |
| اولویتبندی VectorDrawableها | برای آیکونها و گرافیکهای پایه از بردارها استفاده کنید تا مقیاسبندی دقیق با حداقل سربار حافظه تضمین شود. | |
| بهینهسازی تحویل تصویر سمت سرور | APIهای بکاند را طوری پیکربندی کنید که تصاویر متناسب با تراکم دستگاه و ابعاد کانتینر رابط کاربری ارائه دهند . | |
| حاشیههای شفاف را حذف کنید | با استفاده از InsetDrawable یا layout padding به جای حاشیههای از پیش تعیینشده، از تخصیص حافظه برای پیکسلهای «نامرئی» جلوگیری کنید. به بخش مهندسی برنامههای اندروید با عملکرد حافظه بالا مراجعه کنید. | |
| استفاده مجدد | پیکربندی اندازههای بهینه حافظه پنهان | محدودیتهای حافظه و حافظه پنهان دیسک را بر اساس رم دستگاه و وضوح صفحه نمایش تنظیم کنید. به ذخیرهسازی بیتمپها مراجعه کنید. |
| بازیافت | پاکسازی منابع در پسزمینه | برای پاک کردن حافظههای پنهان و بهبود بقای فرآیند در هنگام فشار بر حافظه سیستم TRIM_MEMORY_BACKGROUND را پیادهسازی کنید . |
| انتشار داراییها زمانی که رابط کاربری پنهان است | از TRIM_MEMORY_UI_HIDDEN برای آزادسازی حافظههای نهان بیتمپ زمانی که برنامه دیگر برای کاربر قابل مشاهده نیست، استفاده کنید . | |
| نظارت بر نشت حافظه | از LeakCanary و Memory Profiler برای یافتن بیتمپهایی که پس از از بین رفتن LifecycleOwner آنها باقی ماندهاند، استفاده کنید. به مدیریت حافظه برنامه خود مراجعه کنید. |