معدل التحديث المتعدد

يضيف 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 .

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

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