تقليل استهلاك ذاكرة الرسومات

في حزمة الرسومات، تقع ذاكرة تخزين مؤقت لكل طبقة بين Composer HAL وSurfaceFlinger لتقليل النفقات العامة المرتبطة بإرسال واصفات الملفات عبر IPC. قبل الإصدار Android 14، لم يكن النظام يمحو ذاكرة التخزين المؤقت هذه عند قطع اتصال GraphicBufferProducer عن GraphicBufferConsumer في SurfaceFlinger، مثلاً عند قطع اتصال MediaCodec عن SurfaceView. بدءًا من Android 14، يمكنك إفراغ ذاكرة التخزين المؤقت هذه بالقوة لتقليل استهلاك ذاكرة الرسومات.

اختَر أحد الخيارَين التاليَين:

  • بالنسبة إلى الأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، يجب تنفيذ الإصدار 3.2 الجديد من واجهة برمجة تطبيقات Composer HAL. يتم تفعيل هذا الخيار تلقائيًا ويحفظ أكبر قدر من الذاكرة. يمكن أيضًا للأجهزة التي يتم ترقيتها إلى الإصدار 14 والإصدارات الأحدث استخدام هذا الخيار للاستفادة من مزايا الذاكرة الكاملة.
  • بالنسبة إلى الأجهزة التي سيتم ترقيتها إلى Android 14 والتي لا تريد تنفيذ واجهة برمجة التطبيقات Composer HAL 3.2 عليها، يمكنك تفعيل الخيار المتوافق مع الإصدارات القديمة. يوفّر هذا الخيار مقدارًا من الذاكرة يقارب المقدار الذي يوفّره الخيار السابق.

يوضّح القسمان التاليان كيفية تنفيذ كل خيار.

تنفيذ واجهة برمجة التطبيقات Composer HAL 3.2

للاستفادة من مزايا ذاكرة التخزين المؤقت الكاملة للرسومات، يجب إجراء ما يلي:

  1. حدِّث تنفيذ Composer HAL إلى الإصدار 3.2.
  2. تعالج LayerCommand::bufferSlotsToClear عن طريق إزالة إدخالات ذاكرة التخزين المؤقت للمخزن المؤقت المشار إليها بأرقام الخانات الواردة في القائمة.

تتوفّر واجهات برمجة التطبيقات Composer HAL 3.2 ذات الصلة بذاكرة مخزن مؤقت للرسومات، بما في ذلك LayerCommand::bufferSlotsToClear، في ملف LayerCommand.aidl.

تفعيل الخيار المتوافق مع الأنظمة القديمة

يستبدل خيار تقليل استخدام الذاكرة المتوافق مع الإصدارات السابقة المخزن المؤقت الفعلي في خانة ذاكرة التخزين المؤقت بمخزن مؤقت بديل بحجم 1x1. ويؤدي ذلك إلى توفير الذاكرة لجميع خانات المخزن المؤقت التي تمت إزالتها، باستثناء خانة المخزن المؤقت النشطة الحالية. لتحقيق بعض فوائد توفير الذاكرة، فعِّل الخيار المتوافق مع الإصدارات القديمة من خلال ضبط surface_flinger.clear_slots_with_set_layer_buffer sysprop على true. يمكن العثور على سمة النظام هذه في الملف property_contexts.

يتطلّب ضبط sysprop أن يتعامل تنفيذ Composer HAL بشكل صحيح مع أوامر setLayerBuffer المتعددة للطبقة نفسها في دورة عرض واحدة.

يؤدي تفعيل خيار التوافق مع الأنظمة القديمة إلى ما يلي:

  • بالنسبة إلى طبقات HAL التي تستخدم لغة تعريف واجهة Android (AIDL)، يرسل SurfaceFlinger عدة مثيلات LayerCommand لطبقة واحدة، ويكون لكل منها BufferCommand واحد. يحتوي كل BufferCommand على معرّف مؤقت لمخزن مؤقت بحجم 1x1 ورقم خانة لمخزن مؤقت في ذاكرة التخزين المؤقت يتطلب إفراغه.

  • بالنسبة إلى طبقات HAL التي تستخدم لغة تعريف واجهة HIDL، يرسل SurfaceFlinger أوامر متعددة SELECT_DISPLAY وSELECT_LAYER وSET_BUFFER. تحتوي هذه الأوامر على معرّف مؤقت لمخزن مؤقت بحجم 1x1 ورقم خانة لمخزن مؤقت في ذاكرة التخزين المؤقت يتطلب إفراغه.

قد يتسبّب الخيار المتوافق مع الإصدارات القديمة في تعطُّل Composer HAL على بعض الأجهزة. قد تتمكّن من تعديل Composer HAL لحلّ هذه المشكلة. يمكنك العثور على الرمز الذي يتحكّم في هذا السلوك هنا:

اختبار استهلاك ذاكرة التخزين المؤقت لمخزن الرسومات المؤقت

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

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

بالنسبة إلى اختبارات VTS الجديدة، يُرجى الاطّلاع على الروابط التالية: