بدءًا من الإصدار 13 من نظام التشغيل Android، يتم تخصيص إطارات عرض جديدة، والتي يتم استخدامها أثناء عملية compositing في العملاء، عند تغيُّر دقة الشاشة. ينفّذ SurfaceFlinger عملية التخصيص هذه في دورة إبطال التالية بعد تغيير درجة الدقة.
إدارة إطار الذاكرة أثناء تبديل درجة الدقة
تحدث التغييرات في درجة الدقة بسبب أحد السيناريوهين التاليين:
حدث hotplug، وهو حدث بدأه "أداة إنشاء الأجهزة" (HWC)، والذي يحدث عند التبديل من شاشة خارجية واحدة إلى شاشة خارجية مختلفة ذات دقة تلقائية مختلفة.
أثناء حدث التوصيل السريع، يتم رفع المؤشرات إلى المخازن المؤقتة للإطارات القديمة عندما يتم تخصيص بيانات العرض القديمة.
يشير هذا المصطلح إلى مفتاح تبديل لوضع العرض بدأه SurfaceFlinger، ويحدث ذلك عندما يغيّر المستخدم درجة الدقة من خلال إعدادات المستخدم، أو عندما يغيّر أحد التطبيقات درجة الدقة باستخدام
preferredDisplayModeId
.أثناء تبديل وضع العرض، يُطلق SurfaceFlinger عناوين ذاكرة التخزين المؤقت لإطارات العميل الحالية قبل استدعاء
setActiveConfig
أوsetActiveConfigWithConstraints
.
لتجنّب حدوث مشاكل خطيرة، مثل تجزئة الذاكرة، على الأجهزة التي لا تحجز ذاكرة كافية لإطارَي التخزين المؤقت القديم والجديد، من الضروري أن يتوقف "العرض السخيف للرسومات" عن استخدام إطارَي التخزين المؤقت القديمين وأن يُطلق أي مرجعَي ذاكرة لإطارَي التخزين المؤقت هذين كما هو موضّح في الحالات التالية:
بالنسبة إلى أحداث hotplug، قبل استدعاء
onHotplug
مباشرةً.بالنسبة إلى عمليات تبديل الوضع، بعد طلب
setActiveConfig
أوsetActiveConfigWithConstraints
مباشرةً.
يسمح تحرير المعالِجات بإلغاء تخصيص ذاكرة إطار التخزين المؤقت بالكامل قبل تخصيص إطارات تخزين مؤقت جديدة ينفّذها SurfaceFlinger أثناء دورة إلغاء الصلاحية التالية.
اقتراحات لإدارة ذاكرة التخزين المؤقت للإطار
إذا لم يطلق HWC مؤشرات إلى المخزن المؤقت للإطارات القديمة في الوقت المناسب، سيحدث تخصيص المخزن المؤقت للإطارات الجديد قبل إلغاء المخزن المؤقت القديم للإطارات. قد يتسبب هذا في مشكلات كارثية عندما يخفق التخصيص الجديد بسبب التجزئة أو مشكلات أخرى. والأسوأ من ذلك، إذا لم تُطلق معالجة طلبات البحث في الأجهزة الجوّالة هذه الأسماء المعرِّفة على الإطلاق، يمكن أن يؤدي ذلك إلى تسرُّب ذاكرة.
لتجنُّب حالات تعذُّر التخصيص بشكلٍ كبير، اتّبِع الاقتراحات التالية:
إذا كان يجب أن يواصل "العرض المتقدّم للرسومات" (HWC) استخدام إطارات عرض العميل القديمة إلى أن يتم توفير ملفّات عرض العميل الجديدة، من المهم حجز ذاكرة كافية لملفّات عرض العميل القديمة والجديدة، وربما تشغيل خوارزميات إزالة التجزئة على مساحة ذاكرة ملفّ عرض الرسومات.
خصِّص مجموعة ذاكرة مخصَّصة للمخزن المؤقت للإطارات المنفصل عن باقي ذاكرة التخزين المؤقت للرسومات. وهذا أمر مهم لأنّه بين إلغاء تخصيص ذاكرة التخزين المؤقت للإطارات وإعادة تخصيصها، يمكن لعملية تابعة لجهة خارجيةمحاولة تخصيص ذاكرة الرسومات. إذا كان إطار التخزين المؤقت يستخدم ذاكرة الرسومات نفسها وكانت ذاكرة الرسومات ممتلئة، يمكن للعملية التابعة لجهة خارجية أن تشغَل ذاكرة الرسومات التي تم تخصيصها سابقًا لإطار التخزين المؤقت، وبالتالي لا تتوفّر ذاكرة كافية لإعادة تخصيص إطار التخزين المؤقت أو قد يؤدي ذلك إلى تجزئة مساحة الذاكرة.
اختبار إدارة إطار الذاكرة
ننصح المصنّعين الأصليّين للأجهزة باختبار إدارة ذاكرة إطار التخزين المؤقت للعميل بشكلٍ سليم على مستوى مبدّلات الدقة لجهازهم، كما هو موضّح أدناه:
بالنسبة إلى أحداث التوصيل السريع، ما عليك سوى فصل شاشتَين مختلفتَين بدقةَين مختلفتَين وإعادة توصيلها.
بالنسبة إلى عمليات تبديل الأوضاع، استخدِم اختبار
ModeSwitchingTestActivity
CTS Verifier لبدء تبديل الوضع من أجل اختبار سلوك ذاكرة إطار التخزين المؤقت. يمكن لهذا الاختبار تحديد المشاكل التي يصعب رصدها برمجيًا بشكل مرئي.