معدّلات إعادة تحميل متعددة

يتيح نظام التشغيل Android 11 استخدام معدّلات تحديث متعدّدة على الأجهزة. تتضمّن هذه الميزة ثلاثة مكوّنات رئيسية:

  • تم طرح واجهات برمجة تطبيقات جديدة لطبقة تجريد الأجهزة (HAL) في الإصدار android.hardware.graphics.composer@2.4.
  • رمز النظام الأساسي لتحليل إعدادات الجهاز لمعدلات إعادة التحميل المختلفة وضبط معدل إعادة التحميل المطلوب
  • واجهات برمجة تطبيقات جديدة في حزمة تطوير البرامج (SDK) وحزمة التطوير الأصلية (NDK) للسماح للتطبيقات بضبط عدد اللقطات المطلوب في الثانية

التنفيذ

تمت إضافة دعم مخصّص لتبديل معدّل التحديث في android.hardware.graphics.composer@2.4 HAL. ننصح بشدة باستخدام هذا الإصدار لأنّ الإصدارات السابقة من composer HAL لا تتوافق إلا بشكل محدود مع ميزة تبديل معدّل إعادة التحميل.

مجموعات الضبط

تمت إضافة السمة الجديدة CONFIG_GROUP إلى IComposerClient::Attribute، ويمكن البحث عنها باستخدام واجهة برمجة التطبيقات getDisplayAttribute_2_4. تتيح هذه السمة للمورّدين تجميع إعدادات العرض معًا. تتيح الإعدادات في المجموعة نفسها التبديل السلس بينها في معظم الحالات. تستخدم المنصة مجموعة الإعدادات للتمييز بين الإعدادات التي يمكن التبديل بينها من أجل تغيير معدل التحديث وليس السمات الأخرى لإعداد معيّن.

لنفترض المثال التالي الذي يوضّح مزايا استخدام مجموعات الضبط مع جهاز يتوافق مع أربعة إعدادات عرض:

  • ‫1080p@60Hz
  • ‫1080p@90Hz
  • ‫1080i@72Hz
  • ‫1080i@48Hz

على الرغم من أنّ الجهاز يتوافق مع معدلات تحديث تبلغ 48 هرتز و60 هرتز و72 هرتز و90 هرتز، يعمل العرض بوضع مختلف، ويؤدي التبديل من 60 هرتز إلى 72 هرتز إلى تغيير إعدادات العرض من 1080p إلى 1080i، وهو ما قد لا يكون السلوك المطلوب. ويمكن حلّ هذه المشكلة باستخدام مجموعات الضبط. من خلال تجميع 60 هرتز و90 هرتز معًا في مجموعة إعدادات واحدة و48 هرتز و72 هرتز في مجموعة إعدادات أخرى يدرك النظام الأساسي أنّه يمكنه التبديل بين 60 هرتز و90 هرتز وبين 48 هرتز و72 هرتز، ولكن ليس بين 60 هرتز و72 هرتز لأنّ ذلك سيؤدي إلى تغيير في الإعدادات بدلاً من مجرد تغيير معدل إعادة التحميل.

تعديلات على Composer API

getDisplayVsyncPeriod
تمت إضافة
لتحكّم أفضل وتوقّع أفضل عند تغيير معدّلات التحديث.getDisplayVsyncPeriod تعرض getDisplayVsyncPeriod معدّل إعادة التحميل الحالي (من حيث فترة المزامنة العمودية) الذي تعمل به الشاشة. ويكون ذلك مفيدًا بشكل خاص عند الانتقال بين معدّلَي تحديث، إذ تحتاج المنصة إلى معدّل التحديث الحالي لتحديد وقت بدء الإطار التالي.
setActiveConfigWithConstraints
الطريقة setActiveConfigWithConstraints هي إضافة جديدة إلى الطريقة الحالية setActiveConfig وتوفّر المزيد من المعلومات حول تغيير الإعدادات. يتم تقديم القيود كجزء من مَعلمات vsyncPeriodChangeConstraints، وهي تحتوي على المَعلمات التالية.
    desiredTimeNanos
    الوقت في CLOCK_MONOTONIC الذي قد يتغير بعده وقت المزامنة العمودية (أي يجب ألا يتغير وقت المزامنة العمودية قبل هذا الوقت). يكون ذلك مفيدًا عندما تريد المنصة التخطيط مسبقًا لتغيير معدّل التحديث، ولكن لديها بعض المخازن المؤقتة في قائمة الانتظار لعرضها. تضبط المنصة هذا الوقت وفقًا لذلك من أجل احتساب تلك المخازن المؤقتة والتأكّد من أنّ عملية الانتقال إلى معدّل التحديث ستكون سلسة قدر الإمكان.
    seamlessRequired
    إذا كانت القيمة صحيحة، يجب أن يتم تغيير فترة المزامنة العمودية بسلاسة بدون أي تشوّهات مرئية ملحوظة. تستخدم المنصة هذا العلامة عندما يكون من الضروري تغيير معدّل التحديث نتيجةً لتغيير في المحتوى (مثلاً، يكون الجهاز غير نشط وتبدأ الصورة المتحركة). ويمنح ذلك المورّد فرصة لعدم السماح بإجراء تغييرات معيّنة في الإعدادات عندما قد تؤدي إلى ظهور تشوّهات مرئية ملحوظة. إذا تعذّر تغيير الإعدادات بسلاسة وتم ضبط seamlessRequired على true، من المتوقّع أن تعرض عملية التنفيذ SEAMLESS_NOT_POSSIBLE كرمز إرجاع وأن تستدعي معاودة الاتصال الجديدة onSeamlessPossible عند إمكانية إجراء التغيير نفسه في الإعدادات بسلاسة.

عند نجاح التنفيذ، تعرض الدالة قيمة VsyncPeriodChangeTimeline التي تحدّد للمنصة الوقت المتوقّع لحدوث تغيير معدّل التحديث. يجب ضبط المَعلمات على الوقت في CLOCK_MONOTONIC عندما يبدأ تحديث الشاشة الجديدة في فترة المزامنة العمودية الجديدة.newVsyncAppliedTimeNanos يساعد ذلك، إلى جانب desiredTimeNanos، المنصة في التخطيط مسبقًا لعملية تبديل معدّل التحديث وبدء احتساب عدد مرات التحديث للتطبيقات وفقًا لمعدّل التحديث الجديد مسبقًا. يتيح ذلك الانتقال بسلاسة بين معدّلات التحديث.

تتطلّب بعض عمليات التنفيذ إرسال إطار معدّل قبل إرسال معدّل التحديث. لهذا الغرض، يحتوي HAL على المَعلمة refreshRequired للإشارة إلى ضرورة عرض إطار جديد، وعلى المَعلمة refreshTimeNanos للإشارة إلى أول عملية مزامنة عمودية يجب بعدها إرسال إطار جديد.

onVsyncPeriodTimingChanged [callback]
دالة ردّ نداء جديدة يمكن أن يستدعيها HAL لإبلاغ النظام الأساسي بأنّ بعض مَعلمات المخطط الزمني قد تغيّرت وأنّ النظام الأساسي بحاجة إلى تعديل المخطط الزمني. من المتوقّع أن يتم استدعاء وظيفة رد الاتصال هذه إذا لم يتم تلقّي المخطط الزمني القديم لسبب ما بسبب طول مدة المعالجة في طبقة تجريد الأجهزة (HAL) أو بسبب تأخّر عرض إطار التحديث.

كيف تقرّر المنصة تغيير معدّل التحديث؟

يتم اختيار معدّل التحديث في خدمتَي النظام التاليتَين:

DisplayManager
تحدّد السمة DisplayManager السياسة ذات المستوى الأعلى في ما يتعلّق بمعدّل إعادة التحميل. ويضبط هذا الإجراء إعدادات العرض التلقائية، وهي نفسها إعدادات HAL الخاصة بالمكوّن. بالإضافة إلى ذلك، يحدّد نطاقًا من القيم الدنيا والقصوى التي يمكن أن يختارها SurfaceFlinger كعدد مرات إعادة التحميل.
‫SurfaceFlinger
تحدّد معدّل التحديث من خلال ضبط إعدادات ضمن مجموعة الإعدادات نفسها التي تتضمّن الإعدادات التلقائية، مع معدّل تحديث ضمن النطاق الأدنى/الأقصى.

تتّبع "أداة إدارة العرض" الخطوات التالية لتحديد السياسة:

  • تعثر هذه الدالة على رقم تعريف الإعدادات التلقائية من خلال طلب البحث عن الإعدادات النشطة من SurfaceFlinger
  • تقييد نطاق الحدّ الأدنى والأقصى للقيم من خلال التكرار على مستوى شروط النظام
    • إعداد معدّل التحديث التلقائي: يتم ضبط قيمة معدّل التحديث التلقائي في R.integer.config_defaultRefreshRate. تُستخدَم هذه القيمة لتحديد معدّل إعادة تحميل الجهاز التلقائي للرسوم المتحركة والتفاعلات باللمس.
    • إعداد أعلى معدّل إعادة تحميل: تتم قراءة قيمة أعلى معدّل إعادة تحميل من Settings.System.PEAK_REFRESH_RATE. يتم تغيير هذه القيمة في وقت التشغيل لتعكس إعداد الجهاز الحالي (مثل خيار من القائمة). يتم ضبط القيمة التلقائية في تراكب الإعداد R.integer.config_defaultPeakRefreshRate.
    • إعداد الحدّ الأدنى لمعدّل إعادة التحميل: تتم قراءة الحدّ الأدنى لمعدّل إعادة التحميل من Settings.System.MIN_REFRESH_RATE. يمكن تغيير هذه القيمة في وقت التشغيل لتعكس إعداد الجهاز الحالي (مثل خيار من القائمة). القيمة التلقائية هي 0، لذا لا يوجد حدّ أدنى تلقائي.
    • المعرّف ModeId الذي طلبه التطبيق: يمكن للتطبيقات ضبط WindowManager.LayoutParams.preferredDisplayModeId لعرض الإعداد المفضّل الذي يجب أن تعمل به الشاشة. في معظم الحالات، تضبط DisplayManager المعرّف التلقائي للإعدادات بما يتناسب مع ذلك، وتضبط الحد الأدنى والأقصى لمعدّل إعادة التحميل ليتوافق مع معدّل إعادة التحميل الخاص بالإعدادات.
    • توفير شحن البطارية: يتم حصر معدل التحديث على 60 هرتز أو أقل عندما يكون الجهاز في وضع توفير الطاقة، ويتم الإشارة إلى ذلك من خلال Settings.Global.LOW_POWER_MODE.

بعد أن يضبط DisplayManager السياسة، يضبط SurfaceFlinger معدّل إعادة التحميل استنادًا إلى الطبقات النشطة (الطبقات التي تضع تحديثات الإطارات في قائمة الانتظار). إذا ضبط مالك الطبقة معدّل عرض اللقطات، سيحاول SurfaceFlinger ضبط معدّل التحديث على قيمة مضاعفة لهذا المعدّل. على سبيل المثال، إذا ضبطت طبقتان نشطتان معدّل عرض اللقطات على 24 و60، سيختار SurfaceFlinger معدّل 120 هرتز إذا كان متاحًا. إذا لم يكن معدّل التحديث هذا متاحًا لـ SurfaceFlinger، سيحاول اختيار معدّل التحديث الذي يتضمّن أقل خطأ في معدّل عرض اللقطات. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات المطوّرين على developer.android.com.

تحتفظ SurfaceFlinger بالعلامات التالية للتحكّم في كيفية تحديد معدّل التحديث:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: إذا لم يتم ضبط معدّل عرض اللقطات، سيتم تحديد معدّل التحديث استنادًا إلى الطبقات النشطة. يحتفظ SurfaceFlinger بإرشادات إرشادية لتحديد متوسط عدد اللقطات في الثانية التي تنشر بها الطبقة المخازن المؤقتة، وذلك من خلال النظر إلى الطابع الزمني للعرض التقديمي المرفق بالمخزن المؤقت.
  • ro.surface_flinger.set_touch_timer_ms: إذا كانت القيمة > 0، سيتم استخدام معدّل التحديث التلقائي عند لمس المستخدم للشاشة خلال المهلة المحدّدة. يتم تنفيذ هذه الطريقة التجريبية للاستعداد لمعدّل التحديث التلقائي للصور المتحركة.
  • ro.surface_flinger.set_idle_timer_ms: إذا كانت القيمة > 0، سيتم استخدام الحد الأدنى لمعدّل التحديث عند عدم توفّر أي تحديثات للشاشة خلال المهلة المحدّدة.
  • ro.surface_flinger.set_display_power_timer_ms: إذا كانت القيمة > 0، سيتم استخدام معدل التحديث التلقائي عند تشغيل الشاشة (أو عند الخروج من وضع "الشاشة قيد التشغيل دائمًا") لمهلة الإيقاف المحدّدة.

Frame Rate API

تتيح واجهة برمجة التطبيقات الخاصة بمعدّل عرض اللقطات للتطبيقات إبلاغ منصة Android بمعدّل عرض اللقطات المطلوب، وهي متاحة للتطبيقات التي تستهدف الإصدار 11 من نظام التشغيل Android. لمزيد من المعلومات حول واجهة برمجة التطبيقات الخاصة بمعدّل عرض اللقطات، يُرجى الاطّلاع على مستندات المطوّرين على developer.android.com.

خيارات المطوّرين

تمت إضافة خيار مطوّر برامج جديد إلى القائمة التي تتيح تفعيل أو إيقاف تراكب على الشاشة يعرض معدّل إعادة التحميل الحالي. يتوفّر الخيار الجديد ضمن الإعدادات > النظام > خيارات المطوّرين > عرض معدّل التحديث.