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