عند بدء صورة متحركة في Android، غالبًا ما يتم تسريع معدل إعادة تحميل الشاشة إلى أقصى حد لضمان تجربة سلسة. بالنسبة إلى الصور المتحركة الصغيرة، مثل أشرطة التقدم وأدوات عرض الصوت، لا يكون معدّل التحديث العالي هذا ضروريًا، ويؤدي إلى زيادة استهلاك الطاقة.
بدءًا من الإصدار Android 15، يمكن للأجهزة المزوّدة بميزة معدل التحديث التكيُّفي (ARR) تقليل مدة استخدام معدل التحديث العالي من جهتَين:
- من خلال التحسينات الجديدة لإدارة عدد اللقطات في الثانية على المنصة، يمكن للتطبيقات عرض المحتوى بعدد لقطات أقل في الثانية تلقائيًا وزيادة عدد اللقطات إلى عدد مرتفع فقط عند الضرورة.
- يتطابق معدّل إعادة تحميل الشاشة ديناميكيًا مع معدّل عرض المحتوى بدون تقطُّع.
على الرغم من أنّ معظم التطبيقات ستستفيد من ميزة "معدل عرض اللقطات المتغير" بدون أي تعديلات، يمكنك أيضًا إلغاء السلوك التلقائي لمعدل عرض اللقطات عند الضرورة.
توضّح هذه الصفحة ما يلي:
- كيفية تحديد معدّل عرض اللقطات لكلّ عرض
- السياسة العامة لكيفية تحديد معدّل عرض الإعلانات في الثانية لعدد اللقطات في الثانية
- كيفية إلغاء السلوك التلقائي لمعدل عرض اللقطات يدويًا
آلية التصويت في "العرض"
في نظام View في Android، يمكن لكل View في التسلسل الهرمي لواجهة المستخدم التعبير عن معدل عرض اللقطات المفضّل. يتم جمع هذه الإعدادات المفضّلة ودمجها لتحديد معدل عرض اللقطات النهائي لكل لقطة. ويتم تحقيق ذلك من خلال آلية تصويت حيث تُجري كل مشاهدة تصويتًا استنادًا إلى سمة معدل عرض اللقطات، والتي يمكن أن تكون فئة أو معدّلًا محدّدًا. يُجري المستخدمون عادةً تصويتًا على المشاهدات عند رسمها أو تعديلها. ويتم جمع هذه الأصوات لتحديد عدد اللقطات النهائي في الثانية، والذي يتم إرساله بعد ذلك إلى المحتوى المعروض في المستوى الأدنى كإشارة للعرض.
في الوقت الحالي، يتم ضبط معظم طرق العرض تلقائيًا على معدل عرض "عادي" للإطارات، والذي يتم ضبطه غالبًا على 60 هرتز. للحصول على معدلات عرض أعلى للإطارات، يمكنك استخدام واجهات برمجة تطبيقات معيّنة لتخصيص الإعدادات المفضّلة، مع اختيار النظام بشكل عام لأعلى معدل عرض للإطارات. لمزيد من المعلومات عن استخدام واجهات برمجة التطبيقات هذه، اطّلِع على قسم ضبط معدل التقاط الصور أو الفئة. يمكنك الاطّلاع على السياسات العامة المتعلّقة بمعدّلات التحديث في قسم سياسة معدلات عرض الإعلانات العامة.
فئات عدد اللقطات في الثانية
في فئة View
، تتوفّر فئات مختلفة لمعدل عرض اللقطات يمكن
استخدامها في التصويت. في ما يلي وصف كل فئة:
REQUESTED_FRAME_RATE_CATEGORY_DEFAULT
: يمكن ضبط هذه القيمة للعودة إلى السلوك التلقائي، ما يشير إلى أنّ "طريقة العرض" هذه لا تتضمّن بيانات عن معدّل عرض اللقطات.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE
: لن يؤثّر العرض صراحةً في معدّل عرض اللقطات. وهذا يعني أنّه حتى إذا كان العرض نشطًا، لن يأخذ الإطار المرجعي ذلك في الاعتبار عند تحديد معدل عرض اللقطات.REQUESTED_FRAME_RATE_CATEGORY_NORMAL
: يشير إلى عدد لقطات متوسط في الثانية مناسب للصور المتحركة التي لا تتطلّب عدد لقطات أعلى في الثانية أو لا تستفيد من النعومة العالية. وعادةً ما يكون هذا التردد 60 هرتز أو قريبًا منه.-
REQUESTED_FRAME_RATE_CATEGORY_HIGH
: يشير إلى عدد اللقطات في الثانية المناسب للصور المتحركة التي تتطلّب عددًا مرتفعًا من اللقطات في الثانية، ما قد يؤدي إلى زيادة سلاسة العرض ولكن قد يؤدي أيضًا إلى زيادة استهلاك الطاقة.
لا يتم التصويت على "عرض" إلا إذا كان يتطلّب إعادة رسمه. يتم تحديد معدّل عرض اللقطات النهائي حسب عدد الأصوات الأعلى. على سبيل المثال، إذا كانت جميع الأصوات لصالح "عادي"، يتم اختيار "عادي" . عند حدوث تصويتَين "عادي" و "مرتفع"، يتم اختيار "مرتفع".
عدد اللقطات في الثانية
بالإضافة إلى فئات معدل عرض اللقطات، يمكن أن تحدّد "طريقة العرض" أيضًا معدل عرض اللقطات المفضّل، مثل 30 أو 60 أو 120 هرتز. عند التصويت على عدّة معدلات عرض لقطات، يتم تحديد معدل عرض اللقطات النهائي بالاستناد إلى القواعد التالية:
- مضاعفات بعضها: إذا كانت معدّلات اللقطات التي تم التصويت عليها مضاعفات لبعضها، يتم اختيار القيمة الأعلى. على سبيل المثال، إذا كان هناك تصويتان، هما 30 هيرتز و90 هيرتز، يتم اختيار 90 هيرتز كمعدل عرض اللقطات النهائي.
- يجب ألا تكون مضاعفات بعضها:
- إذا كان أي من الأصوات أعلى من 60 هرتز، يتم احتسابه كصوت "مرتفع".
- إذا كانت جميع الأصوات 60 هرتز أو أقل، يتم احتسابها على أنّها صوت "عادي".
بالإضافة إلى ذلك، إذا كان هناك مجموعة من قيم معدل عرض اللقطات وفئاته، تحدّد القيمة الأعلى عادةً معدل العرض النهائي. على سبيل المثال، عند اختيار سرعة عرض 60 هرتز ومستوى الأداء "عالي"، أو سرعة عرض 120 هرتز ومستوى الأداء "عادي"، سيتم عادةً ضبط معدل العرض على 120 هرتز.
بالإضافة إلى الأصوات الواردة من أحد التطبيقات، قد تكون هناك أيضًا إشارات أخرى يتم إرسالها إلى الطبقة ذات المستوى الأدنى من مكوّنات مختلفة ضمن الإطار نفسه. يمكن أن تأتي العديد من هذه البيانات من مكونات واجهة المستخدم للنظام، مثل المعتمِد للإشعارات وشريط الحالة وشريط التنقّل وغيرها. يتم تحديد قيم معدّل عرض اللقطات النهائية استنادًا إلى الأصوات الواردة من مكوّنات متعددة.
ضبط عدد اللقطات في الثانية أو الفئة
في بعض الحالات، قد يكون لديك عدد لقطات مفضّل في الثانية لعرض معيّن. على سبيل المثال، يمكنك ضبط عدد اللقطات في الثانية المفضّل على "عالٍ" لعرض معيّن لزيادة عدد اللقطات في الثانية إذا كانت الصورة المتحركة تظهر بشكل غير سلس. بالإضافة إلى ذلك، إذا كان هناك صورة متحركة بطيئة أو ثابتة على الفيديو (يتم تشغيلها عادةً بمعدّل 24 أو 30 هرتز)، قد تفضّل تشغيل الصورة المتحركة بمعدّل أقل من "عادي" لتقليل استهلاك الطاقة.
يمكنك استخدام واجهات برمجة التطبيقات setRequestedFrameRate()
و
getRequestedFrameRate()
لتحديد معدّل عرض اللقطات أو
الفئة المفضّلة لعرض معيّن.
Kotlin
// Set the preferred frame rate category to a View // set the frame rate category to NORMAL view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL // set the frame rate category to HIGH view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_HIGH // reset the frame rate category view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT // Set the preferred frame rate to a View // set the frame rate to 30 view.requestedFrameRate = 30f // set the frame rate to 60 view.requestedFrameRate = 60f // set the frame rate to 120 view.requestedFrameRate = 120f
Java
// Set the preferred frame rate category to a View // set the frame rate category to NORMAL view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL); // set the frame rate category to HIGH view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_HIGH); // reset the frame rate category view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT); // Set the preferred frame rate to a View // set the frame rate to 30 view.setRequestedFrameRate(30); // set the frame rate to 60 view.setRequestedFrameRate(60); // set the frame rate to 120 view.setRequestedFrameRate(120);
للاطّلاع على أمثلة على الاستخدام، يُرجى الاطّلاع على TextureView
.
السياسة العامة لميزة "الوصول المحدود للمحتوى"
في القسم السابق، ناقشنا أنّه يتم عرض معظم الصور المتحركة بمعدّل 60 هرتز تلقائيًا، لأنّه تم ضبط كلّ عرض على "عادي" كمعدل عرض اللقطات المفضّل. ومع ذلك، هناك استثناءات يتم فيها زيادة عدد اللقطات في الثانية إلى "عالٍ" لضمان عرض صور متحركة أكثر سلاسة.
في ما يلي السياسة العامة للإيرادات المتكرّرة سنويًا:
- تحسين اللمس: عند رصد حدث لمس (
MotionEvent.ACTION_DOWN
)، يتم رفع معدّل إعادة التحميل إلى "عالٍ" لبعض الوقت بعد رفع الإصبع عن الشاشة للحفاظ على الاستجابة. - إيماءات التمرير السريع: يتم التعامل مع إيماءات التمرير السريع بشكل مختلف، حيث ينخفض معدّل إعادة التحميل تدريجيًا مع انخفاض سرعة التمرير السريع. يمكنك العثور على تفاصيل حول هذا السلوك في قسم تحسين الانتقال.
- تشغيل التطبيقات وعمليات نقل النوافذ: يتم أيضًا زيادة معدّل التحديث لعدة ثوانٍ أثناء تشغيل التطبيقات وإعداد النوافذ وعمليات نقل النوافذ لضمان تجربة مرئية سلسة.
- الصور المتحركة: تتلقّى الصور المتحركة التي تتضمّن تغييرات في الحركة أو الحجم تلقائيًا معدل تحديث أعلى لتحسين سلاسة العرض عند تغيير موضع الاطّلاع أو حجمه.
-
SurfaceView
وTextureView
: يتمّ احترام عدد اللقطات في الثانية الذي تمّ ضبطه صراحةً لملفّيTextureView
وSurfaceView
، ويتمّ تطبيقه وفقًا لذلك.
تفعيل ميزة "تحسين اللمس" وإيقافها
يمكنك تفعيل ميزة "تحسين اللمس" و/أو إيقافها على مستوى Window
. بشكلٍ تلقائي،
عندما يلمس المستخدم الشاشة ويرفع إصبعه عنها، يزداد معدل التقديم
لبعض الوقت. تتيح لك واجهات برمجة التطبيقات setFrameRateBoostOnTouchEnabled()
و
getFrameRateBoostOnTouchEnabled()
منع زيادة معدل معالجة الرسوم عند لمس Window
معيّن.
Kotlin
// disable touch boost on a Window window.isFrameRateBoostOnTouchEnabled = false // enable touch boost on a Window window.isFrameRateBoostOnTouchEnabled = true // check if touch boost is enabled on a Window val isTouchBoostEnabled = window.isFrameRateBoostOnTouchEnabled
Java
// disable touch boost on a Window window.setFrameRateBoostOnTouchEnabled(false) // enable touch boost on a Window window.setFrameRateBoostOnTouchEnabled(true) // check if touch boost is enabled on a Window window.getFrameRateBoostOnTouchEnabled()
تحسين الانتقال للأعلى أو للأسفل
من حالات الاستخدام الرئيسية لتحسين معدّل عرض اللقطات ديناميكيًا هي تحسين تجربة الانتقال السريع (الانزلاق). تعتمد العديد من التطبيقات بشكل كبير على التمرير سريعًا للأعلى لعرض محتوى جديد. يعمل تحسين التمرير في وضع "العرض الإعلاني المتجاوب على شبكة البحث" على تعديل معدل إعادة التحميل بشكل ديناميكي مع إبطاء إيماءة التمرير السريع، ما يؤدي إلى تقليل معدل عرض اللقطات تدريجيًا. ويؤدي ذلك إلى عرض أكثر كفاءة مع الحفاظ على التمرير smoothly سلس.
ينطبق هذا التحسين تحديدًا على مكوّنات واجهة المستخدم القابلة للتنقّل، بما في ذلك
ScrollView
وListView
وGridView
، وقد لا يكون
متاحًا لجميع عمليات التنفيذ المخصّصة.
تتوفّر ميزة الانتقال إلى الأعلى أو الأسفل في "الإعلانات المتجاوبة على شبكة البحث" لكلّ من RecyclerView
و
NestedScrollView
. لتفعيل هذه الميزة في تطبيقك، عليك الترقية إلى أحدث
إصدارَي AndroidX.recyclerview
وAndroidX.core
. اطّلِع على الجدول التالي لمزيد من التفاصيل.
المكتبة |
الإصدار |
|
1.4.0 |
|
1.15.0 |
ضبط معلومات السرعة
إذا كان لديك مكوّن مخصّص قابل للتقديم أو الإيقاف وأردت الاستفادة من ميزة
العرض/الإخفاء، يمكنك استدعاء setFrameContentVelocity()
في كل إطار أثناء
العرض/الإخفاء السلس أو التمرير السريع. راجِع مقتطف الرمز البرمجي التالي للحصول على مثال:
Kotlin
// set the velocity to a View (1000 pixels/Second) view.frameContentVelocity = 1000f // get the velocity of a View val velocity = view.frameContentVelocity
Java
// set the velocity to a View view.setFrameContentVelocity(velocity); // get the velocity of a View final float velocity = view.getFrameContentVelocity()
لمزيد من الأمثلة، اطّلِع على RecyclerView
و
ScrollView
. لضبط السرعة بشكلٍ صحيح، احتسِب
سرعة المحتوى (البكسل في الثانية) يدويًا إذا تعذّر
الحصول على المعلومات المطلوبة من Scroller
أو
OverScroller
.
يُرجى العِلم أنّه في حال استدعاء setFrameContentVelocity()
و
getFrameContentVelocity()
في "المشاهد" التي لا تتضمّن مكونات قابلة للتمرير، لن يكون لهما أي تأثير، لأنّ الحركة تؤدي تلقائيًا إلى زيادة معدل عرض اللقطات استنادًا إلى السياسة الحالية.
إنّ معلومات السرعة ضرورية لضبط معدّل العرض. على سبيل المثال، ضع في الاعتبار إيماءة التمرير السريع. في البداية، يمكن أن تكون سرعة الرمي مرتفعة، ما يتطلّب معدّل عرض أعلى لضمان سلاسة الأداء. مع تقدّم الإيماءة، تنخفض السرعة، ما يسمح بخفض معدّل العرض.
تفعيل ميزة "الاستجابة السريعة للطلبات" وإيقافها
تكون ميزة "معدل الاستبدال العادي" مفعَّلة تلقائيًا لتحسين كفاءة استخدام الطاقة. على الرغم من أنّه يمكنك إيقاف هذه الميزة، لا يُنصح بذلك لأنّ التطبيق سيستهلك مزيدًا من الطاقة. لا تفكر في إيقاف هذه الميزة إلا إذا واجهت مشاكل تؤثر بشكل كبير في تجربة المستخدم.
لتفعيل ميزة "الاستجابة السريعة للطلبات" أو إيقافها، استخدِم واجهة برمجة التطبيقات
setFrameRatePowerSavingsBalanced()
على Window
، أو استخدِم واجهة برمجة التطبيقات
isFrameRatePowerSavingsBalanced()
من خلال ملف styles.xml
.
يوضّح المقتطف التالي كيفية تفعيل ميزة ARR أو إيقافها على Window
:
Kotlin
// disable ARR on a Window window.isFrameRatePowerSavingsBalanced = false // enable ARR on a Window window.isFrameRatePowerSavingsBalanced = true // check if ARR is enabled on a Window val isAdaptiveRefreshRateEnabled = window.isFrameRatePowerSavingsBalanced
Java
// disable ARR on a Window window.setFrameRatePowerSavingsBalanced(false) // enable ARR on a Window window.setFrameRatePowerSavingsBalanced(true) // check if ARR is enabled on a Window window.isFrameRatePowerSavingsBalanced()
لإيقاف ميزة ARR من خلال ملف styles.xml
، أضِف العنصر التالي إلى أسلوبك في res/values/styles.xml
:
<style name="frameRatePowerSavingsBalancedDisabled">
<item name="android:windowIsFrameRatePowerSavingsBalanced">false</item>
</style>