يضيف Android 11 دعمًا للأجهزة ذات معدلات التحديث المتعددة. هناك ثلاثة مكونات رئيسية لهذه الميزة:
- تم تقديم واجهات برمجة تطبيقات HAL الجديدة في
android.hardware.graphics.composer@2.4
. - رمز النظام الأساسي لتحليل تكوينات الجهاز لمعدلات التحديث المختلفة وتعيين معدل التحديث المطلوب
- واجهات برمجة التطبيقات SDK وNDK الجديدة للسماح للتطبيقات بتعيين معدل الإطارات المطلوب
تطبيق
تمت إضافة دعم مخصص لتبديل معدل التحديث إلى android.hardware.graphics.composer@2.4 HAL
. نوصي بشدة باستخدام هذا الإصدار نظرًا لأن الإصدارات السابقة من الملحن HAL تتمتع بدعم محدود لتبديل معدل التحديث.
مجموعات التكوين
تمت إضافة سمة جديدة CONFIG_GROUP
إلى IComposerClient::Attribute
التي يمكن الاستعلام عنها باستخدام getDisplayAttribute_2_4
API. تسمح هذه السمة للبائعين بتجميع تكوينات العرض معًا. تسمح التكوينات الموجودة في نفس المجموعة بالتبديل السلس بينها في معظم الحالات. يتم استخدام مجموعة التكوين بواسطة النظام الأساسي للتمييز بين التكوينات التي يمكن التبديل بينها من أجل تبديل معدل التحديث وليس السمات الأخرى للتكوين.
خذ بعين الاعتبار المثال التالي الذي يوضح فوائد استخدام مجموعات التكوين مع جهاز يدعم تكوينات العرض الأربعة:
- 1080p@60 هرتز
- 1080p@90 هرتز
- 1080i@72 هرتز
- 1080i@48 هرتز
على الرغم من أن الجهاز يدعم معدلات التحديث 48 هرتز و60 هرتز و72 هرتز و90 هرتز، إلا أن الشاشة تعمل في وضع مختلف ويؤدي التبديل من 60 هرتز إلى 72 هرتز إلى تغيير تكوين العرض من 1080 بكسل إلى 1080i، وهو ما قد لا يكون السلوك المرغوب فيه. يتم حل هذا باستخدام مجموعات التكوين. من خلال تجميع 60 هرتز و90 هرتز معًا في مجموعة تكوين واحدة و48 هرتز و72 هرتز في مجموعة تكوين أخرى. تعلم المنصة أنه يمكنها التبديل بين 60 هرتز و90 هرتز وبين 48 هرتز و72 هرتز ولكن ليس بين 60 هرتز و72 هرتز لأن ذلك سيؤدي إلى تغيير التكوين بدلاً من مجرد تغيير معدل التحديث.
تحديثات واجهة برمجة تطبيقات الملحن
- getDisplayVsyncPeriod
- لتحسين التحكم والقدرة على التنبؤ عند تغيير معدلات التحديث، تمت إضافة
getDisplayVsyncPeriod
. تقومgetDisplayVsyncPeriod
بإرجاع معدل التحديث الحالي (من حيث فترة vsync) التي تعمل بها الشاشة. يعد هذا مفيدًا بشكل خاص أثناء الانتقال بين معدل التحديث ومعدل التحديث الحالي الذي يحتاجه النظام الأساسي لتحديد وقت بدء الإطار التالي. - setActiveConfigWithConstraints
- تعد طريقة
setActiveConfigWithConstraints
امتدادًا جديدًا لطريقةsetActiveConfig
الحالية وتوفر مزيدًا من المعلومات حول تغيير التكوين. يتم إعطاء القيود كجزء من معلماتvsyncPeriodChangeConstraints
وتحتوي على المعلمات التالية. - this.timeNanos
- الوقت في
CLOCK_MONOTONIC
الذي قد تتغير بعده فترة vsync (أي أن فترة vsync يجب ألا تتغير قبل هذا الوقت). يعد هذا مفيدًا عندما يريد النظام الأساسي التخطيط مسبقًا لتغيير معدل التحديث ولكن لديه بالفعل بعض المخازن المؤقتة في قائمة الانتظار لتقديمها. يقوم النظام الأساسي بتعيين هذا الوقت وفقًا لذلك لحساب تلك المخازن المؤقتة والتأكد من أن انتقال معدل التحديث سيكون سلسًا قدر الإمكان. - مطلوب سلس
- إذا كان هذا صحيحًا، فإنه يتطلب أن يحدث تغيير فترة vsync بسلاسة دون أي أثر بصري ملحوظ. يتم استخدام هذه العلامة بواسطة النظام الأساسي عندما تكون هناك حاجة إلى تغيير معدل التحديث نتيجة لتغيير المحتوى (على سبيل المثال، يكون الجهاز خاملاً وتبدأ الرسوم المتحركة). وهذا يمنح البائع الفرصة لعدم السماح بإجراء تغييرات معينة على التكوين عندما قد تؤدي إلى ظهور قطعة أثرية مرئية ملحوظة. إذا لم يكن من الممكن تغيير التكوينات بسلاسة وتم ضبط سلسة
seamlessRequired
علىtrue
، فمن المتوقع أن يقوم التنفيذ بإرجاعSEAMLESS_NOT_POSSIBLE
كرمز الإرجاع واستدعاء رد الاتصالonSeamlessPossible
الجديد عندما يكون من الممكن إجراء نفس تغيير التكوين بسلاسة. عند النجاح، يقوم التنفيذ بإرجاع
VsyncPeriodChangeTimeline
الذي يخبر النظام الأساسي بالوقت المتوقع لحدوث تغيير في معدل التحديث. يجب ضبط معلماتnewVsyncAppliedTimeNanos
على الوقت فيCLOCK_MONOTONIC
عندما يبدأ تحديث العرض الجديد في فترة vsync الجديدة. يتيح هذا، جنبًا إلى جنب معdesiredTimeNanos
، للنظام الأساسي التخطيط مسبقًا لتبديل معدل التحديث وبدء تحديد التطبيقات لمعدل التحديث الجديد مسبقًا. وهذا يسمح بالانتقال السلس لمعدل التحديث.تتطلب بعض التطبيقات إرسال إطار تحديث قبل إرسال معدل التحديث. لذلك، يحتوي HAL على المعلمة
refreshRequired
للإشارة إلى أن هناك حاجة إلى إطار تحديث والمعلمةrefreshTimeNanos
للإشارة إلى أول vsync حيث يجب إرسال إطار التحديث بعده.- onVsyncPeriodTimingChanged [رد الاتصال]
- رد اتصال جديد يمكن استدعاؤه بواسطة HAL للإشارة إلى النظام الأساسي بأن بعض معلمات المخطط الزمني قد تغيرت وأن النظام الأساسي يحتاج إلى ضبط المخطط الزمني الخاص به. من المتوقع أن يتم استدعاء رد الاتصال هذا إذا تم تفويت المخطط الزمني القديم لسبب ما بسبب وقت المعالجة الطويل في HAL أو إطار التحديث المتأخر.
كيف تقرر المنصة تغيير معدل التحديث؟
يتم تحديد معدل التحديث في خدمتي النظام التاليتين:
- مدير العرض
- يقوم
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) للمهلة التي تم تكوينها.
واجهة برمجة تطبيقات معدل الإطارات
تتيح واجهة برمجة التطبيقات لمعدل الإطارات للتطبيقات إبلاغ نظام Android الأساسي بمعدل الإطارات المقصود، وهي متاحة في التطبيقات التي تستهدف Android 11. لمعرفة المزيد حول واجهة برمجة التطبيقات لمعدل الإطارات، راجع وثائق المطور على موقع Developer.android.com .
خيارات للمطور
تمت إضافة خيار مطور جديد إلى القائمة الذي يقوم بتبديل التراكب على الشاشة بمعدل التحديث الحالي. الخيار الجديد موجود ضمن الإعدادات > النظام > خيارات المطور > إظهار معدل التحديث.