۰۳ اسفند ۹۶ ، ۱۲:۳۴
سجاد یوسف نیا ۰ نظر Share

Glide در برابر Picasso

    در این مقاله ما Glide نسخه ی 3.7.5 و Picasso نسخه ی 2.5.2 را مقایسه می کنیم. بسته به اینکه چه زمانی شما در حال خواندن این مقاله هستید، آخرین نسخه ی ممکن است متفاوت باشد.

import کردن پروژه 
Picasso و Glide ،هر دو در jcenter قرار دارند. شما با dependency زیر به آسانی می توانید آنها را به پروژه تان اضافه کنید:
پیکاسو :

dependencies {
    compile 'com.squareup.picasso:picasso:2.5.1'
}
گلاید :

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:22.0.0'
}
برای بیشتر پروژه ها support-v4 dependency مورد نیاز نیست چون بیشتر آنها به صورت پیش فرض از کتابخانه ی support پشتیبانی می کنند.
سایز و Method Count :
اگر سایز فایل jar هر دو کتابخانه را با یکدیگر مقایسه کنیم ، اندازه ی Glide تقریبا 3.5 برابر بزرگتر از اندازه ی Picasso است.
مقدار Mehtod Count کتابخانه ی پیکاسو 849 است در حالی که مقدار Method Count کتابخانه ی گلاید 2678 است. با توجه به اینکه میزان حداکثر Methods در فایل DEX اندرویدی 65535 است میزان 2678 به نظر زیاد می رسد. اگر می خواهید از Glide  استفاده کنید بهتر است ProGuard را فعالسازی کنید.
سینتکس (نگارش نحوی ):
هر دو کتابخانه تقریبا سینتکس یکسانی دارند می توانید راحتی عکس را از URL ای دانلود کرده و در یک imageView نمایش دهید. هر دو کتابخانه از Fade animations ( کم کم ناپدید شدن ) و CenterCrop (برش مرکزی ) پشتیبانی می کنند.همچنین شما می توانید از متد PlaceHolder برای نمایش موقعی که تصویر باموفقیت لود می شود یا موقعی که لود کردن با مشکل روبرو می شود استفاده کنید. 
گلاید:
Glide.with(myFragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .crossFade()
    .into(myImageView);
پیکاسو :
Picasso.with(myFragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .into(myImageView);


همچنین نکته ی مهمی که در مورد گلاید وجود دارد این است که مطابق و هماهنگ با lifeCycle ( چرخه ی عمر ) اکتیویتی و فرگمنت طراحی شده است. شما می توانید context اکتیویتی یا فرگمنت را به ()Glide.with ارسال کنید و خودش به طور هوشمندانه با Callback های lifecycle اکتیویتی مانند ()onPause و ()onResume هماهنگ خواهد شد.


Disk caching :
هر دو کتابخانه از کش کردن تصویر در دیسک پشتیبانی می کنند. آنها تصویر را از URL دانلود کرده و با کش کردن، تصویر را در دیسک ذخیره می کنند. ولی تفاوت هایی در مورد اینکه چجوری تصاویر را در کش ذخیره می کنند وجود دارد.
Picasso تصویر را دانلود کرده و با اندازه ی کامل در کش ذخیره می کند ( در مورد من رزولوشن 750*1160 است) و هر گاه به تصویر نیاز داشته باشیم، تصویر را با اندازه ی کامل به ما می دهد و همان موقع برای فیت شدن تصویر با imageView آنرا ریسایز می کنند.
از سوی دیگر گلاید به صورت متفاوتی عمل می کند. گلاید تصاویر را از URL داده شده دانلود می کند و مطابق با imageView ریسایز کرده و در DiskCache ذخیره می کند. پس در نتیجه اگر شما بخواهید یک تصویر را برای دو imageView ی غیر هم سایز لود کنید ،گلاید دو کپی متفاوت از تصویر یکسان که رزولوشن های متفاوتی دارند را در کش ذخیره می کند. که این کار باعث افزایش فصای Diskcache می شود، ولی باز هم این کار مزایای خودش را دارد که در بخش بعدی به آن خواهیم پرداخت.
موقعی که من داشتم imageView را به اندازه های مختلفی تنطیم می کردم ، پیکاسو فقط یک تصویری که دارای اندازه ی کامل است را کش می کرد. در حالی که گلاید فایلهای جداگانه ای را برای قرار دادن در imageView ، کش می کند، نقطه صعف این روش این است که اگر چه یک تصویر قبلا یک بار دانلود شده است، اگر نیاز باشد تصویر را در یک imageView ی با اندازه ی متفاوت لود کنید، احتیاج به دانلود مجدد آن قبل از ریسایز شدن به رزولوشن مناسب احتیاج دارید سپس کش می شود.
حافظه :
به صورت پیش فرض ، برای لود Bitmap گلاید از پیکربندی RGB_555 استفاده می کند در حالی که پیکاسو تصاویر را به صورت پیکر بندی ARGB_8888 لود می کند. در نتیجه برای مقایسه ی عادلانه من تغییراتی را در GlideModule اعمال کردم تا تصاویر را به فرمت ARGB_8888 لود کند. بدین صورت که یک کلاسی را ساختم که از GlideModule ایکستند شده بود، به صورت زیر:

<meta-data android:name="example.com.myanimation.GlideConfiguration"
            android:value="GlideModule"/>
public class GlideConfiguration implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}
نمودار پایینی میزان مصرف حافظه را در لود کردن تصاویر در گلاید و پیکاسو نشان می دهد:
با نگاه کردن به نمودار مشخص معلوم می شود که گلاید از لحاظ حافظه ( حدود 8 مگابایت ) کارآمدتر از پیکاسو ( حدود 13 مگابایت ) عمل می کند. این امر باعث می شود چیزی که در قسمت قبل گفتیم دلیلش مشخص شود، پیکاشو تصویر را به صورت کامل درون حافظه لود می کند و برای فیت کردن اندازه با imageView به GPU نیاز دارد. در حالی که گلاید یک تصویری را لود می کند که قبلا به ازای هر imageView ریسایز شده است، در نتیجه باعث می شود که لود کردن تصویر در گلاید نسبت به لود کردن تصویر در پیکاسو مصرف حافظه ی کمتری داشته باشد که این کار باعث پیشگیری از به وجود آمدن outOfMemotyError می شود.
زمان صرف شده برای لود کردن تصویر :
هنگامی که داریم یک تصویر را را از یک URL لود می کنیم. هر دو کتابخانه (کش محلی ) Local cache خود را چک می کنند ، اگر تصویر در کش وجود نداشت ، تصویر را از URL دانلود می کنند.
هنگامی که تصویر را از URL دانلود می کردم ، پیکاسو کاملا سریع تر از گلاید دانلود می کرد. شاید دلیلش این است که پیکاسو مستقیما تصویر را در imageView قرار می دهد در حالی که گلاید تصویر را بر اساس ابعاد imageView ریسایز می کند. و کمی زمان صرف ریسایز کردن تصویر می شود ( شما با استفاده از thumbnail می توانید این زمان را کاهش دهید ، در بخش های بعدی در این مورد بیشتر بحث خواهیم کرد).


این در حالی است که در لود کردن از کش، گلاید بهتر عمل می کند این به خاطر برتری روش طراحی طراحی گلاید است. در حالی که پیکاسو مقداری تاخیر در لود کردن دارد به این دلیل که قبل از ست کردن تصاویر برای imageView نیازمند این است که تصاویر را - به صورت بی درنگ - ریسایز کند. حتی اگر از ()noFade برای ظاهر کردن فوری استفاده شود.


به همین دلایل ما از گلاید برای برنامه ی 1Wall — Wallpapers در Multidots استفاده کرده ایم. تصاویر بسیار زیادی وجود دارند که بایستی قبل از اینکه کاربر اسکرول کند لود شوند و به هیچ وجه نبایستی با خطای outOfMemory مواجه شویم.
دیگر ویژگی هایی که گلاید پشتیبانی می کند در حالی که پیکاسو پشتیبانی نمی کند :
پشتیبانی از Animated GIF ( گیف متحرک ): گلاید از Animated GIF پشتیبانی می کند . لود کردن GIF ساده است فقط کافی است که متد Glide.with(...).load(...) را فراخوانی کنیم. همچنین چون با Activity lifeCycle هماهنگ است ، AnimatedGIF ها در متد ()onStop متوقف می شوند.در حالی که پیکاسو از تصاویر AnimatedGIF پشتیبانی نمی کند. پس اگر بخواهید AnimatedGIF ای را نمایش دهید، GIF تنها گزینه ی روی میز است :)
پشتیبانی thumbnail : با گلاید شما می توانید چندین تصویر را در یک ویو به طور همزمان لود کنید. برای این کار میتواند ابتدا یک دهم تصویر را در ویو لود کنید، می توانید از کد زیر استفاده کنید:

Glide.with(context)
  .load(Url)
  .thumbnail(0.1f)
  .into(imageView)
این روش بدون هدر دادن حافظه باعث می شود تا زمانی که کاربر صرف لود کردن تصویر می کند، کاهش یابد.
پیکر بندی ها و سفارشی سازی ها : یک نکته ی خوب در مورد گلاید این است که امکانات سفارشی سازی و پیکربندی مختلفی را در اختیاره ما می گذارد. در نتیجه شما می توانید متناسب با نیازتان گلاید را سرعت ببخشید. شما می توانید در این صفحه مطالب بیشتری را در مورد پیکربندی صفحه بخوانید.
نتیجه گیری :
هیچکدام از دو کتابخانه ی گلاید و پیکاسو بی نقص نیست. شما می توانید با توجه به نیازتان یک از اینها را انتخاب کنید . اگر شما برنامه ی کوچکی می سازید و به ویژگی های اندکی نیاز دارید  پیکاسو می تواند برای شما عالی باشد. ولی در صورتی که به سفارشی سازی خیلی بیشتری احتیاج دارید بهتر است از گلاید استفاده کنید.
به عقیده ی من گلاید برنده ی این رقابت است زیرا حافظه را بسیار عالی مدیریت می کند و از خطای outOfMemory در برنامه پیشگیری می کند. همچنین، تصویر را مقداری سریع تر از پیکاسو لود می کند. در ضمن از AnimatedGIF هم پشتیبانی می کند.

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

تصاوير منتخب