يتيح نظام التشغيل Android 11 استخدام أجهزة تتضمّن معدّلات تحديث متعدّدة. تتضمّن هذه الميزة ثلاثة مكوّنات رئيسية:
- واجهات برمجة تطبيقات جديدة لطبقة تجريد الأجهزة (HAL) تم طرحها في الإصدار
android.hardware.graphics.composer@2.4. - رمز النظام الأساسي لتحليل إعدادات الجهاز لمعدلات التحديث المختلفة وضبط معدل التحديث المطلوب
- واجهات برمجة تطبيقات جديدة لحزمة تطوير البرامج (SDK) وNDK تتيح للتطبيقات ضبط عدد اللقطات المطلوب في الثانية
التنفيذ
تمت إضافة دعم مخصّص لتبديل معدّل التحديث إلى … ننصح بشدة باستخدام هذا الإصدار لأنّ الإصدارات السابقة من 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، سيتم استخدام معدّل التحديث التلقائي عند تشغيل الشاشة (أو عند الخروج من وضع "تشغيل الشاشة دائمًا (AOD)") للمهلة التي تم ضبطها.
Frame Rate API
تتيح واجهة برمجة التطبيقات frame rate API للتطبيقات إبلاغ نظام Android الأساسي بعدد اللقطات المطلوب في الثانية، وهي متاحة للتطبيقات التي تستهدف الإصدار Android 11. لمزيد من المعلومات حول frame rate API، يُرجى الاطّلاع على مستندات المطوّرين على developer.android.com.
خيارات المطوّرين
تمت إضافة خيار مطوّر جديد إلى القائمة التي تتيح تفعيل أو إيقاف نافذة مرافِقة تعرض معدّل التحديث الحالي. يتوفّر الخيار الجديد ضمن الإعدادات > النظام > خيارات المطوّرين > عرض معدّل التحديث.