English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

مقارنة بين مبدأ التخزين للصور في Android والخصائص

هذا هو ما قمت بعرضه في MDCC (بإجراء بعض التغييرات)،وقد تم تقديم تحليل المصدر في المرة الأولى عند إطلاق الحلقة الأولى،وسأقوم بتحليل المصدر لاحقًا.

مقارنة لعدة مكتبات تخزين مؤقت للصور من حيث التصميم العام والمبدأ،وحتى إذا لم تستخدموا أصدقاء يمكنكم معرفة كيفية تنفيذها في بعض الخصائص.

الجزء الأول: معلومات أساسية لأربعة مكتبات تخزين مؤقت للصور


Universal ImageLoader هو مكتبة التخزين المؤقت للصور التي تم فتح المصدر بشكل مبكر،وتم استخدامها بكثرة في التطبيقات المبكرة.

Picasso هو مشروع مفتوح المصدر من قبل Square،ويقوده JakeWharton،لذا هو معروف بشكل واسع.

Glide هو مشروع مفتوح المصدر من قبل موظفي Google،ويستخدمه بعض التطبيقات الخاصة بـ Google،وقد تم تقديمه في Google I/O العام الماضي،لكن هناك القليل من المعلومات في الداخل.

Fresco هو مشروع مفتوح المصدر من قبل Facebook في النصف الأول من هذا العام،وخصائصه الرئيسية تشمل:
(1) تشكلت ذاكرة التخزين المؤقت الثلاثية من ذاكرة التخزين المؤقت الثنائية ومكتبة التخزين المؤقت الأصلية

(2) دعم التدفق،يمكن عرض الصور بشكل مشابه لعرض الصور الممحورة بشكل تدريجي على صفحات الويب

(3) دعم أفضل للمحركات المتعددة من صور الفيديو،مثل Gif وWebP

بسبب أن Fresco لم يصدر بعد إصدار 1.0 الرسمي،وأنني لم أجد وقتًا كافيًا لفهم مصدر Fresco،لن يشمل المقارنة في المستقبل Fresco،وسأضيف مقارنة في وقت لاحق إذا كان لدي وقت.

المزيد من مكتبات التخزين المؤقت للصور يمكن العثور عليها في: مكتبات التخزين المؤقت للصور في Android

الجزء الثاني: المفاهيم الأساسية

قبل مقارنة رسمية،تعرفوا أولاً على بعض المفاهيم العامة لذاكرة الصور المتبادلة:
(1) مدير الطلبات: وحدة إنشاء وإدارة الطلبات

(2) المحرك: الجزء المسؤول عن إنشاء المهام (الحصول على البيانات) وتنسيق تنفيذها

(3) واجهة الحصول على البيانات: مسؤولة عن الحصول على البيانات من مصادر مختلفة.
مثل MemoryCache للحصول على بيانات من التخزين المؤقت في الذاكرة،DiskCache للحصول على بيانات من التخزين المحلي،ومستخرج البيانات من الإنترنت،إلخ.

(4) عرضاء: عرض الموارد (الصور) المستخدمة لعرض أو تعديل الموارد.
مثل ImageView،تدعم هذه المخزونات غير فقط ImageView،بل تدعم أيضًا أنواع أخرى من Views و مفهوم Displayer الافتراضي.

(5) Processor للموارد (صور) معالج
مثل معالجة الموارد،مثل التدوير،التضييق،القطع،إلخ.

أسماء هذه المفاهيم قد تختلف من مكتبة إلى أخرى،مثل Displayer في ImageLoader يُدعى ImageAware،في Picasso و Glide يُدعى Target.

النقطة الثالثة: الفوائد المشتركة

1. سهولة الاستخدام
يمكن تحقيق الحصول على الصور وعرضها من خلال سطر برمجي واحد.

2. درجة التكيف مرتفعة،درجة التكيف مرتفعة
مثل محول التحميل (ميكانيكية التجديد)،محول الترميز،مظهر،معالج،تخزين مؤقت في الذاكرة،تخزين محلي،مجموعة من الخلايا التي تعمل في الخلفية،خوارزمية التخزين المؤقت،يمكن تكوينها بسهولة.

درجة التكيف مرتفعة،يتم تعديل تكوين التخزين المؤقت بناءً على أداء النظام،وتبدأ الاستراتيجية بالتحرك بشكل ديناميكي بعد تغيير معلومات النظام.
مثل تحديد عدد الإنتاجية القصوى بناءً على عدد نواة المعالج،تحديد حجم التخزين المؤقت في الذاكرة بناءً على حجم الذاكرة المتاحة،تعديل عدد الإنتاجية القصوى عند تغيير حالة الاتصال بالشبكة، إلخ.

3. تخزين مؤقت متعدد المستويات
كلها تحتوي على على الأقل مستويين من التخزين المؤقت،زيادة سرعة تحميل الصور. 

4. دعم مصادر متعددة
يدعم مصادر متعددة، مثل الشبكة، المحلية، الموارد، Assets، إلخ

5. دعم أنواع متعددة من Displayer
يستند فقط إلى ImageView،بل يدعم أيضًا أنواع أخرى من Views و مفهوم Displayer الافتراضي.

نقاط مشتركة صغيرة أخرى تشمل دعم الرسوم المتحركة،دعم معالجة transform،الحصول على معلومات EXIF، إلخ.

النقطة الرابعة: تصميم ImageLoader وأفضليته

1. التصميم والتدفق العام

الشكل السابق هو رسم تخطيطي عام لـ ImageLoader. يتم تقسيم المكتبة إلى خمس وحدات رئيسية هي ImageLoaderEngine،Cache و ImageDownloader،ImageDecoder،BitmapDisplayer و BitmapProcessor،وتم تقسيم Cache إلى MemoryCache و DiskCache.

بشكل بسيط، ImageLoader يتلقى مهمة تحميل وتحديد الصور ويقوم بتسليمها إلى ImageLoaderEngine،ويقوم ImageLoaderEngine بتوزيع المهمة على مجموعة من الخلايا التي تعمل في الخلفية لتنفيذها، ويتم الحصول على الصور من خلال Cache و ImageDownloader، وربما يتم معالجتها بواسطة BitmapProcessor و ImageDecoder، حتى يتم تحويلها إلى Bitmap ويتم تسليمها إلى BitmapDisplayer لعرضها في ImageAware.

2. مزايا ImageLoader

(1) يدعم مراقبة تقدم التحميل

(2) يمكن إيقاف تحميل الصور أثناء تمرير الرؤية
من خلال واجهة PauseOnScrollListener يمكن إيقاف تحميل الصور أثناء تمرير الرؤية.

(3) يتم تنفيذ عدة خوارزميات التخزين في الذاكرة بشكل افتراضي هذه المحفظات للصور يمكن تكوين خوارزميات التخزين، ولكن ImageLoader يتم تنفيذ العديد من خوارزميات التخزين بشكل افتراضي، مثل الحذف الأولي الأكبر حجمًا، الحذف الأولي المستخدم أولاً، الحذف الأولي الأقل استخدامًا، الحذف الأولي الأقدم أولاً، الحذف الأولي الأطول وقتًا وما إلى ذلك.

(4) يدعم تعريف قواعد أسماء الملفات المحلية المخزنة

خامسًا، تصميم Picasso وأفضليته

1. التصميم والتدفق العام

هذا هو رسم المخطط العام لـ Picasso. يتم تقسيم المكتبة إلى وحدات مثل Dispatcher، RequestHandler وDownloader، PicassoDrawable وما إلى ذلك.

يتولى Dispatcher توزيع وتعامل Actions، بما في ذلك التقديم، التوقف، المتابعة، الإلغاء، تغيير حالة الشبكة، المحاولة مرة أخرى وما إلى ذلك.

بشكل بسيط، Picasso يتلقى مهمة تحميل وتحديد الصور، ويقوم بإنشاء Request ويقوم بتسليمه إلى Dispatcher، يقوم Dispatcher بتوزيع المهمة على RequestHandler المحدد، يتم الحصول على الصورة من MemoryCache وHandler (واجهة الحصول على البيانات) وتظهر الصورة في Target عبر PicassoDrawable.

يجب ملاحظة جزء File system في Data أعلاه، Picasso لا يقدم واجهة لتعريف المحفظة المحلية المخصصة، يستخدم المحفظة المحلية الخاصة بـ http بشكل افتراضي، يستخدم okhttp في API 9 وما فوق، يستخدم Urlconnection في الأسفل، لذا إذا كنت بحاجة إلى تعريف محفظة محلية مخصصة،则需要 إعادة تعريف Downloader.

2. مزايا Picasso

(1) يحتوي على وظيفة مراقبة الإحصاء
يدعم مراقبة استخدامه لمحفظة الصور، بما في ذلك معدل النجاح في المحفظة، حجم الذاكرة المستخدمة، التوفير في البيانات وغيرها.

(2) يدعم معالجة الأولويات
قبل كل مهمة جدولة يتم اختيار المهمة ذات الأولوية العالية، مثل عندما يكون أولوية Banner في صفحة التطبيق أعلى من أولوية أيقونة.

(3) يدعم التأخير حتى إكمال حساب حجم الصورة

(4) يدعم وضع الطيران، وعدد الأنماط المدمجة يتغير بناءً على نوع الشبكة
عندما يتحول الهاتف إلى وضع الطيران أو تغيير نوع الشبكة، يتم تعديل عدد الأنماط المدمجة بشكل تلقائي، مثل wifi أكبر عدد من الأنماط المدمجة هو 4، 4g هو 3، 3g هو 2.
يقرر Picasso عدد التنفيذ المتوازي القصوى بناءً على نوع الشبكة وليس عدد نواة المعالج. 

(5) 'لا يوجد' مخزن محلي
لا يوجد 'مخزن محلي'، وليس أن هناك لا مخزن محلي، بل لم يكن Picasso يتحقق من ذلك، بل كان يوكل هذه المهمة إلى مكتبة أخرى من Square وهي okhttp، مما يتيح التحكم في تاريخ انتهاء الصلاحية للصور من خلال Cache-Control و Expired في رأس الطلب.

الجزء السادس: تصميم Glide ومزاياها

1. التصميم والتدفق العام

هذا هو رسم المخطط التجميعي لـ Glide. يتم تقسيم المكتبة إلى وحدات مثل RequestManager (مدير الطلبات)، Engine (محرك الحصول على البيانات)، Fetcher (مستخرج البيانات)، MemoryCache (مخزن الذاكرة)، DiskLRUCache، Transformation (معالجة الصور)، Encoder (تخزين المحلي)، Registry (إعداد أنواع الصور والمحللين)، Target (الهدف) وما إلى ذلك.

بشكل بسيط، Glide يتلقى مهمة تحميل وعرض الموارد، ويقوم بإنشاء Request ويقوم بتسليمه إلى RequestManager، يبدأ Request في تشغيل Engine للحصول على الموارد من المصدر (من خلال Fetcher)، وعند الحصول عليها يتم معالجتها بواسطة Transformation ويتم تسليمها إلى Target.

يعتمد Glide على مكتبات مفتوحة المصدر مثل DiskLRUCache و GifDecoder للقيام بعملية التخزين المحلي وتعريف صور Gif.

2. مزايا Glide

(1) مخزن صور -> مخزن وسائط
Glide ليس مجرد مخزن صور، بل يدعم Gif و WebP و-thumbnails. حتى الفيديو، لذا يجب أن يُعتبر مخزن وسائط. 

(2) يدعم معالجة الأولويات

(3) متزامن مع حياة Activity/Fragment، يدعم trimMemory
يحافظ Glide على RequestManager لكل سياق، ويبقى متزامنًا مع حياة Activity/Fragment من خلال FragmentTransaction، كما يوفر واجهة trimMemory للدعوة.

(4) يدعم okhttp و Volley
يستخدم Glide بشكل افتراضي UrlConnection للحصول على البيانات، ويمكن استخدامه مع okhttp أو Volley. كما يدعم ImageLoader و Picasso okhttp و Volley أيضًا.

(5) صديق للذاكرة
① يحتوي Glide على تصميم نشط للمخزن المؤقت في ذاكرة الوصول العشوائي
عند سحب البيانات من المخزن المؤقت، لا تستخدم مثل العادة get، بل استخدم remove، ثم ضع هذه البيانات المخزنة في خريطة activeResources التي تحتوي على قيمة مرجع ناعم، وعدّل عدد الاستدعاءات، وأجري التقييم عند اكتمال تحميل الصورة، إذا كان عدد الاستدعاءات فارغًا، فتم التخلص منه.

② الصور في المخزن المؤقت أصغر
يستخدم Glide url و view_width و view_height و دقة الشاشة كأوامر مدمجة، ويخزن الصور المعالجة في المخزن المؤقت في ذاكرة الوصول العشوائي بدلاً من الصور الأصلية لتوفير المساحة

③ يتطابق مع دورة حياة Activity/Fragment، ودعم trimMemory

④ يستخدم الصورة بشكل افتراضي RGB_565 بدلاً من ARGB_888
بالرغم من أن دقة الصورة ضعيفة بعض الشيء، إلا أن حجمها أصغر ويمكن تكوينها إلى ARGB_888

الآخر: يمكن لـ Glide دعم انتهاء الصلاحية لـ url من خلال signature أو بدون استخدام مخزن محلي

الجمعة، التجميع


على الرغم من أن وظائف ImageLoader بسيطة وسهلة الفهم، إلا أن طول الوظائف ووظائف التوكيل عادةً. 

بالرغم من أن كود Picasso موجود في حزمة واحدة فقط وليس هناك تفرقة واضحة بين الحزم، إلا أن كوده بسيط وواضح، يمكن الحصول على فهم عميق في غضون ساعات قليلة.

يعد Glide قويًا، لكن كوده كبير وعملياته معقدة. يُنصح باستخدامه فقط بعد فهم عميق، لتجنب صعوبة التعامل مع المشاكل.

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تدعموا تعليمات النطق.

بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع صاحب الحقوق الأصلية به، ويتم توفير المحتوى من قبل مستخدمي الإنترنت الذين يقدمون المساهمات بشكل تلقائي ويعملون على تحميلها، ولا يمتلك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية تتعلق بذلك. إذا اكتشفت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لتقديم الشكوى، مع تقديم الأدلة ذات الصلة، وسيتم حذف المحتوى المزعوم عن حقوق النسخ فور التحقق منه.

سيحبك