في حزمة الرسومات، توجد ذاكرة تخزين مؤقت لكل طبقة بين Composer HAL وSurfaceFlinger لتقليل الحمل المرتبط بإرسال واصفات الملفات عبر IPC. قبل إصدار Android 14، لم تتم إزالة ذاكرة التخزين المؤقت هذه عندما يتم قطع اتصال GraphicBufferProducer
عن SurfaceFlinger GraphicBufferConsumer
، كما هو الحال عندما يتم قطع اتصال MediaCodec عن SurfaceView. بدءًا من Android 14، يمكنك مسح ذاكرة التخزين المؤقت هذه بالقوة لتقليل استهلاك ذاكرة الرسومات.
اختر أحد الخيارين التاليين:
- بالنسبة للأجهزة التي تعمل بنظام التشغيل Android 14 والإصدارات الأحدث، يجب عليك تنفيذ إصدار Composer HAL API الجديد 3.2. يتم تنشيط هذا الخيار بشكل افتراضي ويحفظ أكبر قدر من الذاكرة. يمكن أيضًا للأجهزة التي تقوم بالترقية إلى الإصدار 14 والإصدارات الأحدث استخدام هذا الخيار لتحقيق فوائد الذاكرة الكاملة.
- بالنسبة للأجهزة التي تقوم بالترقية إلى Android 14 والتي لا ترغب في تنفيذ Composer HAL 3.2 API لها، يمكنك تمكين الخيار المتوافق مع الإصدارات السابقة. يوفر هذا الخيار قدرًا كبيرًا من الذاكرة تقريبًا مثل الخيار السابق.
يشرح القسمان التاليان كيفية تنفيذ كل خيار.
تنفيذ Composer HAL 3.2 API
لتحقيق فوائد الذاكرة المؤقتة للرسومات بشكل كامل، يجب عليك:
- قم بتحديث تطبيق Composer HAL الخاص بك إلى الإصدار 3.2.
- قم بمعالجة
LayerCommand::bufferSlotsToClear
عن طريق إزالة إدخالات ذاكرة التخزين المؤقت المُشار إليها بأرقام الفتحات الموجودة في القائمة.
توجد واجهات برمجة تطبيقات Composer HAL 3.2 المرتبطة بالذاكرة المؤقتة الرسومية، بما في ذلك LayerCommand:bufferSlotsToClear
، في LayerCommand.aidl-
.
تمكين الخيار المتوافق مع الإصدارات السابقة
يستبدل خيار تقليل الذاكرة المتوافق مع الإصدارات السابقة المخزن المؤقت الحقيقي في فتحة ذاكرة التخزين المؤقت بمخزن مؤقت للعنصر النائب 1x1، مما يؤدي إلى توفير الذاكرة لجميع الفتحات التي تم تطهيرها، باستثناء فتحة المخزن المؤقت النشطة الحالية. لتحقيق فوائد توفير جزئي للذاكرة، قم بتمكين الخيار المتوافق مع الإصدارات السابقة من خلال تعيين surface_flinger.clear_slots_with_set_layer_buffer
sysprop على true
. تم العثور على sysprop هذا في ملف property_contexts
.
يتطلب إعداد sysprop تطبيق Composer HAL الخاص بك للتعامل بشكل صحيح مع أوامر setLayerBuffer
المتعددة لنفس الطبقة في دورة حالية واحدة.
يؤدي تمكين الخيار المتوافق مع الإصدارات السابقة إلى التأثيرات التالية:
بالنسبة لـ AIDL HALs: يرسل SurfaceFlinger مثيلات
LayerCommand
متعددة لطبقة واحدة، تحتوي كل منها علىBufferCommand
واحد. يحتوي كلBufferCommand
على مقبض مخزن مؤقت للعنصر النائب 1x1 ورقم فتحة لفتحة المخزن المؤقت لذاكرة التخزين المؤقت التي يجب إزالتها.بالنسبة لـ HIDL HALs: يرسل SurfaceFlinger أوامر
SELECT_DISPLAY
وSELECT_LAYER
وSET_BUFFER
متعددة. تحتوي هذه الأوامر على مقبض مؤقت للعنصر النائب 1x1 ورقم فتحة لفتحة المخزن المؤقت لذاكرة التخزين المؤقت التي يجب إزالتها.
قد يتسبب الخيار المتوافق مع الإصدارات السابقة في تعطل Composer HAL على بعض الأجهزة. قد تتمكن من تعديل Composer HAL لحل هذه المشكلة. تم العثور على الكود الذي يتحكم في هذا السلوك هنا:
اختبار استهلاك ذاكرة التخزين المؤقت للرسومات
لا يمكن للاختبارات التحقق من إزالة فتحات ذاكرة التخزين المؤقت بواسطة تطبيقات HAL. ومع ذلك، يمكنك استخدام أدوات التصحيح الخاصة بك لمراقبة استخدام المخزن المؤقت للرسومات. أثناء المراقبة، يجب أن تلاحظ وجود عدد أقل من أخطاء نفاد الذاكرة في السيناريوهات التي يتم فيها إيقاف عدة مقاطع فيديو مختلفة وبدء تشغيلها بتتابع سريع على YouTube.
تتوفر اختبارات VTS للتحقق من أن تطبيق HAL قادر وظيفيًا على تلقي مكالمات API الجديدة (HAL الإصدار 3.2+) أو أوامر setLayerBuffer
المتعددة للتنفيذ المتوافق مع الإصدارات السابقة. ومع ذلك، لا ينبغي اعتبار هذا اختبارًا كافيًا للوظائف المناسبة، حيث تجتاز بعض الأجهزة اختبارات VTS هذه، ولكنها تفشل أثناء حالات الاستخدام في العالم الحقيقي.
لاختبارات VTS الجديدة، انتقل إلى الروابط التالية:
متوافق مع HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
متوافق مع AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear