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