قفل المخزن المؤقت بدون إرسال إشارة باستخدام AutoSingleLayer

يقدّم نظام التشغيل Android 13 إعدادًا جديدًا يُسمى AutoSingleLayer لتثبيت المخازن المؤقتة غير المُشار إليها. يتيح هذا الإعداد لـ SurfaceFlinger إمكانية إقفال المخزن المؤقت غير المُشار إليه عندما يتم تعديل طبقة واحدة فقط. ولا ينطبق ذلك على الحالات التي تحدث على مستوى الطبقات، مثل تغييرات الأشكال الهندسية أو معاملات المزامنة.

في السابق، كان بإمكان العلامة debug.sf.latch_unsignaled في مشروع Android المفتوح المصدر (AOSP) أن تتيح لـ SurfaceFlinger إقفال جميع المخازن المؤقتة غير المحدّدة، بغض النظر عن حالة الاستخدام. عند تفعيل هذا الإعداد، قد يتسبّب في آثار جانبية غير مرغوب فيها، مثل إيقاف معاملات المزامنة وتجميد الشاشة بأكملها أثناء انتظار المخازن المؤقتة غير المكتملة.

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

إعدادات وضع AutoSingleLayer

في Android 13، يكون AutoSingleLayer هو الوضع التلقائي لميزة المخزن المؤقت غير المُشار إليه. يتم التحكّم في هذا الوضع من خلال خاصية النظام debug.sf.auto_latch_unsignaled.

يقرأ SurfaceFlinger LatchUnsignaledConfig عند بدء التشغيل. في ما يلي الإعدادات المحتملة:

  • LatchUnsignaledConfig::AutoSingleLayer

    في وضع AOSP التلقائي هذا، يسمح SurfaceFlinger بتثبيت المخازن المؤقتة غير المحدّدة عندما يتم تعديل طبقة واحدة في إطار. يجب أن يتضمّن التعديل فقط تعديلاً على المخزن المؤقت بدون معاملات مزامنة أو تغييرات في الأشكال الهندسية. يضبط هذا الوضع تلقائيًا قيمة debug.sf.auto_latch_unsignaled على true.

  • LatchUnsignaledConfig::Disabled

    يؤدي هذا الوضع إلى إيقاف السلوك غير المحدّد للعمليات غير الموقّعة، ويسمح فقط بالعمليات الموقّعة. يؤدي هذا الوضع أيضًا إلى إيقاف وضع AutoSingleLayer. لضبط هذا الوضع، اضبط debug.sf.latch_unsignaled وdebug.sf.auto_latch_unsignaled على false.

  • LatchUnsignaledConfig::Always

    في هذا الوضع، يثبّت SurfaceFlinger جميع المخازن المؤقتة غير المُشار إليها. لضبط هذا الوضع، اضبط debug.sf.latch_unsignaled على true.

Test AutoSingleLayer

لاختبار ما إذا كان قد تم قفل المخزن المؤقت بدون إشارة، ابحث عن عمليات التتبُّع التالية من SurfaceFlinger في Perfetto:

تتبُّع المخزن المؤقت غير المُشار إليه

الشكل 1. تتبُّع مخزن مؤقت غير مُشار إليه في Perfetto