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