بهینه کردن مصرف Memory توسط تصاویر در اندروید

استاندارد

یکی از چیزایی که تو برنامه‌نویسی موبایل باید خیلی بهش توجه بشه، بحث مصرف بهینه Memory هست. این موضوع از اون جهت مورد اهمیته که حجم Memory  در گویشی‌ها با محدودیت مواجه ( Memory هست ولی کم هست ) و اگه بخوایم بدون درنظر گرفتن این موضوع اپلیکیشنمون رو توسعه بدیم ، احتمال بروز کرش به دلیل نبود حافظه کافی بالا میره . یکی از اون دسته مواردی که باعث میشه حجم مصرفی Memory توی اپلیکیشن‌ها بالا بره، نمایش تصاویر هست. البته منظور وقتیه که بخوایم تصاویر زیادی رو توی اپلیکیشنمون نمایش بدیم .

اینجا میخوایم باهم دو نکته ساده که به وسیله اونها می‌تونیم مصرف Memory تصاویرو بهبود بدیم رو برسی کنیم .

          • تصویرمون رو به همون اندازه‌ای که میخوایم نشون بدیم، load کنیم :

            فرض کنید که یه تصویر خیلی بزرگ دارید که میخواین توی نمایشگر گوشیتون نشون بدین ، از اونجایی  نمیتونیم تصویر رو با اندازه اصلی توی نمایشگر کوچیک گوشی نشون بدیم، پس لازم هم نیست که تصویر رو با اندازه اصلیش load کنیم، بعلاوه این کار منطقیی هم نیست . پس به راحتی با load کردن تصویر به همون اندازه‌ای که امکان نمایشش رو داریم، حافظه کمتری رو مصرف می‌کنیم . حالا چطوری می‌تونیم اینکارو انجام بدیم .
            اگه از Picasso استفاده میکنید : Picasso تابعی به اسم ()fit برای انجام این کار داره ، این تابع اندازه ImageView که قراره Picasso تصویر رو توی اون Load کنه میگیره و بعد تصویر رو به همون اندازه که برای نمایش در ImageView لازمه تغییر سایز میده .

             اگه میخواین مستقیم با BitMap کار کنید : برای این کار طبق مستندات گوگل می‌تونید از کد زیر استفاده کیند .

            تابع calculateInSampleSize به وسیله سایز اصلی bitmap و سایز ImageView مون که به عنوان ورودی براش ارسال کردیم، بیشترین مقدار subSampling ای که می‌تونیم روی تصویر اصلی انجام بدیم رو محاسبه میکنه . subSampling در اینجا به این معنی هست که مثلا ما به ازای هر ۴ پیکسل یکیش رو برای نمایش نگه میداریم که به واسطه همین امر طول و عرض تصویر نهاییمون یک چهارم تصویر اصلی میشه . همینطور این مقدار رو به صورت توانی از ۲ محاسبه میکنیم چون طبق مستندات گوگل اگه این عدد توانی از دو نباشه به نزدیک‌ترین عدد توان ۲ گرد میشه .
            تابع دوم یعنی decodeSampledBitmapFromResource هم کارش اعمال تغییر اصلی هست ، ابتدا با ست کردن options.inJustDecodeBounds=true برای BitmapFactory می‌تونیم اندازه اصلی bitmap مون رو بدون تخصیص حافظه بهش داشته باشیم و بعد از محاسبه مقدار subSampling و ست کردن مقدارش برای options.inSampleSize ، در اخرین مرحله دوباره options.inJustDecodeBounds=false میکنیم تا بتونیم به bitmap مون حافظه اختصاص بدیم و تمام .

          • انتخاب فرمت مناسب برای ذخیره سازی پکیسل‌ها

            توی اندروید ما ۴ فرمت برای ذخیره سازی پیکسل‌ها داریم .
            ALPHA_8 , ARGB_4444 , RGB_565 , ARGB_8888 که هر کدوم میزان متفاوتی بایت برای ذخیره هر پیکسل استفاده میکنند .
            ARGB_8888 فرمت پیش فرض load تصاویر هست و هر پیکسل رو توی ۴ بایت ذخیره میکنه ، که مقدار قابل توجهیه و به همین دلیل بیشترین کیفیت خروجی رو این فرمت میده .
            RGB_565 : این فرمت هر پیکسل رو توی ۲ بایت ذخیره میکنه و کیفیت قابل قبولی هم داره و به همین دلیل می‌تونه جایگزین مناسبی برای ARGB_8888 باشه .
            ALPHA_8 : این فرمت تنها یک بایت برای ذخیره کردن هر پیکسل نیاز داره ولی هیچ اطلاعات رنگیی رو ذخیره نمیکنه .
            ARGB_4444 :به دلیل کیفیت بد از اندروید ۱۳ به بعد دیگه پشتیبانی نمیشه .
            Untitled-1

            در بالا یک تصویر که هم با ARGB_8888 لود شده و هم با RGB_565 هست، همونطور که میبینید  RGB_565 هم کیفیت قابل قبولی داره و هم حافظه کمتری مورد نیاز داره ، پس قطعا می‌تونه یه گزینه منطقی برای استفاده باشه.
            چگونگی تغییز config در Picasso : برای اینکار باید یه کلاس  بسازید و اون رو به عنوان کلاس Application برای اپلیکیشنتون معرفی کنید ( اینجا می‌تونید ببینید چطور میشه این کار رو انجام داد ) .
            در مرحله بعد کد زیر رو توی ‌onCreate کلاستون بنویسید .


            و بعد از اون، همونطور که همیشه از ‌Picasso استفاده میکردید استفاده کنید ( اینجا می‌تونید راجع‌به نحوه استفاده از Picasso بخونید ) .
            چگونگی تغییر config در حالت کلی : با استفاده از کد زیر می‌تونید فرمت تصویری رو که قصد لود کردن اون رو دارید تغییر بدید .

            بعد از اعمال این تغییرات می‌تونید به وسیله Memory monitoring اندروید استدیو که توی تب Android monitor هست، میزان مصرف حافظه در هر حالت رو ببینید و با هم مقایسه کنید .

4 دیدگاه در “بهینه کردن مصرف Memory توسط تصاویر در اندروید

  1. مهدیکو

    خیلی مقاله خوبی بود.
    البته ذکر این نکته ضروریه که درسته با دستور fit میشه حافظه رو بهینه تر مصرف کرد ولی باعث بار اضافی روی cpu هم میشه. مخصوصا توی لیست ویو ها و ریسایکلر ویو ها باید با احتیاط استفاده بشه. (در این مورد مطمئن نیستم، باید تست بشه)

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *