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

يتيح نظام 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 API. تسمح هذه السمة للمورّدين بتجميع إعدادات العرض معًا. تتيح الإعدادات في نفس المجموعة التبديل السلس بينها في معظم الحالات. تستخدم المنصة مجموعة الضبط للتمييز بين الإعدادات التي يمكن التبديل بينها بهدف تبديل معدّل إعادة التحميل وليس السمات الأخرى للإعداد.

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

  • ‫1080p بمعدل 60 هرتز
  • ‫1080p بمعدل 90 هرتز
  • 1080i@72 هرتز
  • ‫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 معدّل التحديث الحالي (من حيث فترة vsync) التي تعمل فيها الشاشة. ويكون ذلك مفيدًا بشكل خاص عند الانتقال بين معدّل التحديث ومعدّل التحديث الحالي الذي تحتاج إليه المنصة لتحديد وقت بدء عرض الإطار التالي.
setActiveConfigWithConstraints
طريقة setActiveConfigWithConstraints هي إضافة جديدة لطريقة setActiveConfig الحالية، وتقدّم المزيد من المعلومات عن تغيير الإعدادات. يتم تطبيق القيود كجزء من معلَمات vsyncPeriodChangeConstraints وتحتوي على المعلَمات التالية.
    desiredTimeNanos
    الوقت في CLOCK_MONOTONIC الذي قد تتغير بعده فترة vsync (أي فترة vsync يجب ألا تتغير قبل هذا الوقت). يكون ذلك مفيدًا عندما تريد المنصة التخطيط مسبقًا لتغيير معدل التحديث ولكن لديها بعض العناصر المخزّنة في "قائمة المحتوى التالي" لعرضها. وتضبط المنصة هذا الوقت وفقًا لذلك لمراعاة تلك الموارد الاحتياطية والتأكّد من أن يكون الانتقال إلى معدّل إعادة التحميل سلسة قدر الإمكان.
    seamlessRequired
    في حال ضبطها على "صحيح"، يجب أن يحدث تغيير فترة vsync بسلاسة بدون حدوث عيوب مرئية ملحوظة. يستخدم النظام الأساسي هذه العلامة عندما تكون هناك حاجة إلى تغيير معدّل التحديث كنتيجة لتغيير المحتوى (على سبيل المثال، عندما يكون الجهاز في وضع عدم النشاط ويبدأ تشغيل الصور المتحركة). يمنح ذلك المورّد فرصة عدم السماح بتغييرات معيّنة في الإعدادات إذا كان من المحتمل أن تؤدي إلى اختلاف ملحوظ في المحتوى المرئي. إذا تعذّر تغيير الإعدادات بسلاسة وتم ضبط seamlessRequired على true، من المفترض أن يعرض التنفيذSEAMLESS_NOT_POSSIBLE كرمز الإرجاع ويُستدعيonSeamlessPossible المرجع الجديد عندما يمكن إجراء تغيير الإعدادات نفسه بسلاسة.

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

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

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

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

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

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

ينفِّذ "مدير الشاشة" الخطوات التالية لتحديد السياسة:

  • يعثر على رقم تعريف الإعداد التلقائي من خلال طلب المعلومات من الإعداد النشط من SurfaceFlinger
  • حصر نطاق الحد الأدنى والحد الأقصى للقيم من خلال تكرار حالات النظام
    • إعداد معدل التحديث التلقائي: يتم ضبط قيمة معدل التحديث التلقائي في تراكب الإعدادات R.integer.config_defaultRefreshRate. تُستخدَم هذه القيمة لتحديد معدّل التحديث العادي للجهاز للرسوم المتحرّكة والتفاعلات باللمس.
    • إعداد أعلى معدّل إعادة تحميل: يتم قراءة قيمة أعلى معدّل إعادة تحميل من Settings.System.PEAK_REFRESH_RATE. يتم تغيير هذه القيمة أثناء التشغيل لتعكس إعداد الجهاز الحالي (مثلاً من أحد خيارات القائمة). يتم ضبط القيمة التلقائية في R.integer.config_defaultPeakRefreshRate تراكب إعدادات R.integer.config_defaultPeakRefreshRate.
    • الحد الأدنى لإعداد معدل إعادة التحميل: تتم قراءة قيمة الحد الأدنى لمعدل إعادة التحميل من Settings.System.MIN_REFRESH_RATE. يمكن تغيير هذه القيمة في بيئة التشغيل لإظهار إعدادات الجهاز الحالية (على سبيل المثال من خيار القائمة). القيمة التلقائية هي 0، لذا لا يوجد حدّ أدنى تلقائي.
    • Application requested 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، سيتم استخدام معدل التحديث تلقائي عند تشغيل الشاشة (أو عند الخروج من وضع AOD) خلال مهلة الانتظار التي تم ضبطها.

Frame Rate API

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

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

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