عند بدء صورة متحركة في نظام التشغيل Android، غالبًا ما يتم رفع معدّل إعادة تحميل الشاشة إلى الحد الأقصى لضمان تجربة سلسة. بالنسبة إلى الصور المتحركة الصغيرة، مثل أشرطة التقدم وعناصر العرض المرئي للصوت، فإنّ معدّل التحديث العالي هذا غير ضروري، ويؤدي إلى ارتفاع استهلاك الطاقة.
بدءًا من نظام التشغيل Android 15، يمكن للأجهزة التي تم تفعيل ميزة "معدّل التحديث التكيّفي" (ARR) عليها تقليل معدّل التحديث المرتفع على مستويَين:
- بفضل التحسينات الجديدة على إدارة عدد اللقطات في الثانية على مستوى النظام الأساسي، يمكن للتطبيقات عرض المحتوى بعدد لقطات أقل في الثانية تلقائيًا، وزيادة عدد اللقطات إلى معدّل مرتفع عند الضرورة فقط.
- يتطابق معدّل إعادة تحميل الشاشة بشكل ديناميكي مع معدّل عرض المحتوى بدون حدوث تشوّش.
مع أنّ معظم التطبيقات ستستفيد من ميزة "تعديل معدّل عرض اللقطات" بدون أي تعديلات، يمكنك أيضًا تجاهل السلوك التلقائي لمعدّل عرض اللقطات حسب الحاجة.
توضّح هذه الصفحة ما يلي:
- كيف يتم تحديد معدّل الإطارات لكل "عرض"؟
- السياسة العامة التي تحدّد كيفية ضبط معدّل اللقطات في الثانية في ARR
- كيفية إلغاء السلوك التلقائي لمعدّل عرض اللقطات يدويًا
آلية التصويت في "العرض"
في نظام العرض في Android، يمكن لكل View في تسلسل هرمي لواجهة المستخدم التعبير عن معدّل اللقطات المفضّل. يتم جمع هذه الإعدادات المفضّلة ودمجها لتحديد معدّل لقطات نهائي لكل لقطة. ويتم تحقيق ذلك من خلال آلية تصويت حيث يصوّت كل عرض استنادًا إلى سمة معدّل عرض اللقطات، والتي يمكن أن تكون فئة أو معدّلًا محددًا. يتم عادةً التصويت على طرق العرض عند رسمها أو تعديلها. يتم دمج هذه الأصوات لتحديد عدد اللقطات النهائي في الثانية، والذي يتم إرساله بعد ذلك إلى الطبقة ذات المستوى الأدنى كتلميح للعرض.
في الوقت الحالي، يتم ضبط معظم طرق العرض تلقائيًا على معدل إطارات "عادي"، والذي يتم غالبًا ضبطه على 60 هرتز. وللحصول على معدلات إطارات أعلى، يمكنك استخدام واجهات برمجة تطبيقات معيّنة لتخصيص الإعدادات المفضّلة، مع اختيار النظام بشكل عام لأعلى معدل إطارات. لمزيد من المعلومات حول استخدام واجهات برمجة التطبيقات هذه، راجِع القسم ضبط معدّل عرض اللقطات أو الفئة. يمكن الاطّلاع على السياسات العامة المتعلقة بمعدلات عرض اللقطات في قسم سياسة ARR العامة.
فئات عدد اللقطات في الثانية
في فئة View
، تتوفّر فئات مختلفة لمعدّل عرض اللقطات يمكن استخدامها في التصويت. في ما يلي وصف لكل فئة:
-
REQUESTED_FRAME_RATE_CATEGORY_DEFAULT
: يمكن ضبط هذه القيمة للعودة إلى السلوك التلقائي، ما يشير إلى أنّ طريقة العرض هذه لا تتضمّن بيانات لمعدّل عرض اللقطات. REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE
: لن يؤثّر العرض بشكل صريح في عدد اللقطات في الثانية. وهذا يعني أنّه حتى إذا كان العرض نشطًا، لن يأخذه إطار العمل في الاعتبار عند تحديد معدّل عرض اللقطات.-
REQUESTED_FRAME_RATE_CATEGORY_NORMAL
: يشير إلى عدد لقطات في الثانية متوسط ومناسب للصور المتحركة التي لا تتطلّب عددًا أكبر من اللقطات في الثانية أو لا تستفيد من السلاسة العالية. ويبلغ هذا المعدّل عادةً 60 هرتز أو ما يقارب ذلك. REQUESTED_FRAME_RATE_CATEGORY_HIGH
: يشير إلى معدّل لقطات في الثانية مناسب للصور المتحركة التي تتطلّب معدّل لقطات في الثانية عاليًا، ما قد يزيد من سلاسة الحركة ولكنه قد يزيد أيضًا من استهلاك الطاقة.
لا يتم احتساب الأصوات إلا إذا كان العرض يتطلّب إعادة رسم. يتم تحديد معدّل اللقطات النهائي من خلال أعلى عدد من الأصوات. على سبيل المثال، إذا كانت جميع الأصوات لصالح "عادي"، سيتم اختيار "عادي". عندما يتم تسجيل أصوات "عادية" و "عالية"، يتم اختيار "عالية".
عدد اللقطات في الثانية
بالإضافة إلى فئات معدّل عرض اللقطات، يمكن أن تحدّد View أيضًا معدّل عرض لقطات مفضّلاً، مثل 30 أو 60 أو 120 هرتز. وعندما يتم تسجيل أصوات متعددة لمعدّل عرض اللقطات، يتم تحديد معدّل عرض اللقطات النهائي وفقًا للقواعد التالية:
- مضاعفات بعضها البعض: إذا كانت معدّلات عرض اللقطات التي تم التصويت عليها هي مضاعفات لبعضها البعض، يتم اختيار أعلى قيمة. على سبيل المثال، إذا كان هناك تصويتان، أحدهما على 30 هرتز والآخر على 90 هرتز، سيتم اختيار 90 هرتز كعدد اللقطات النهائي في الثانية.
- ليست مضاعفات لبعضها البعض:
- إذا كان أي من الأصوات أكبر من 60 هرتز، يتم احتسابه كصوت "عالي".
- إذا كانت جميع الأصوات 60 هرتز أو أقل، يتم احتسابها كصوت "عادي".
بالإضافة إلى ذلك، إذا كان هناك مزيج من قيم معدّل عرض اللقطات وفئاته، تحدّد القيمة الأعلى عادةً معدّل العرض النهائي. على سبيل المثال، عند الجمع بين معدل تصويت 60 هرتز ومعدل تصويت "عالي"، أو بين معدل تصويت 120 هرتز ومعدل تصويت "عادي"، يتم عادةً ضبط معدل العرض على 120 هرتز.
بالإضافة إلى الأصوات الواردة من أحد التطبيقات، قد يتم أيضًا إرسال تلميحات أخرى إلى الطبقة الأدنى مستوى من مكونات مختلفة ضمن الإطار نفسه. يمكن أن تنشأ العديد من هذه الأخطاء من مكونات واجهة مستخدم النظام، مثل لوحة الإشعارات وشريط الحالة وشريط التنقل وغيرها. يتم تحديد قيم معدّل عرض اللقطات النهائي استنادًا إلى الأصوات الواردة من عدة مكوّنات.
ضبط عدد اللقطات في الثانية أو الفئة
في ظروف معيّنة، قد يكون لديك عدد لقطات مفضّل في الثانية لعرض معيّن. على سبيل المثال، يمكنك ضبط معدّل اللقطات المفضّل على "عالية" في View لزيادة معدّل اللقطات إذا ظهرت صورة متحركة غير سلسة. بالإضافة إلى ذلك، إذا كان هناك صورة متحرّكة بطيئة أو ثابتة معروضة على الفيديو (يتم تشغيلها عادةً بمعدل 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
.
سياسة ARR العامة
في القسم السابق، ناقشنا أنّ معظم الرسوم المتحركة يتم عرضها بمعدّل 60 هرتز تلقائيًا، لأنّ كل View تم ضبطه على "عادي" كمعدّل اللقطات المفضّل. ومع ذلك، هناك استثناءات يتم فيها رفع عدد اللقطات في الثانية إلى "عالية" لضمان عرض الصور المتحركة بسلاسة أكبر.
في ما يلي سياسة الإيرادات المتكرّرة سنويًا العامة:
- تعزيز اللمس: عند رصد حدث لمس (
MotionEvent.ACTION_DOWN
)، يتم تعزيز معدّل التحديث إلى "عالي" لبعض الوقت بعد رفع الإصبع عن الشاشة للحفاظ على سرعة الاستجابة. - إيماءات النقر السريع: يتم التعامل مع إيماءات النقر السريع بشكل مختلف، إذ ينخفض معدل إعادة التحميل تدريجيًا مع انخفاض سرعة النقر السريع. يمكنك الاطّلاع على تفاصيل حول هذا السلوك في قسم تحسين التمرير.
- تشغيل التطبيق وانتقالات النوافذ: يتم أيضًا زيادة معدّل التحديث لبعض الوقت أثناء عمليات تشغيل التطبيقات وتهيئة النوافذ وانتقالات النوافذ لضمان تجربة بصرية سلسة.
- الرسوم المتحركة: تحصل الرسوم المتحركة التي تتضمّن حركة أو تغييرات في الحجم تلقائيًا على معدل تحديث أعلى لتحسين سلاسة العرض عند تغيير موضع أو حجم View.
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()
تحسين التمرير
أحد أهم حالات الاستخدام لتحسين معدّل عرض اللقطات بشكل ديناميكي هو تحسين تجربة التمرير السريع. تعتمد العديد من التطبيقات بشكل كبير على تمرير المستخدمين للأعلى للاطّلاع على محتوى جديد. تعمل ميزة تحسين التمرير السريع في ARR على تعديل معدّل إعادة التحميل ديناميكيًا عندما تبطئ حركة التمرير السريع، ما يؤدي إلى خفض معدّل عرض اللقطات تدريجيًا. يوفّر ذلك عرضًا أكثر كفاءة مع الحفاظ على سلاسة التمرير.
ينطبق هذا التحسين تحديدًا على مكوّنات واجهة المستخدِم القابلة للتمرير، بما في ذلك
ScrollView
وListView
وGridView
، وقد لا يكون متاحًا لجميع عمليات التنفيذ المخصّصة.
تتوفّر ميزة التمرير السريع في ARR على 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()
في "طرق العرض" التي ليست مكوّنات قابلة للتمرير، لن يكون لهما أي تأثير، لأنّ الحركة تؤدي تلقائيًا إلى زيادة عدد اللقطات في الثانية استنادًا إلى السياسة الحالية.
تُعدّ معلومات السرعة ضرورية لتعديل معدّل العرض. على سبيل المثال، فكِّر في إيماءة النقر السريع. في البداية، يمكن أن تكون سرعة العرض عالية، ما يستلزم معدّل عرض أعلى لضمان سلاسة الحركة. ومع تقدّم الإيماءة، تنخفض السرعة، ما يسمح بخفض معدّل العرض.
تفعيل ميزة "الواقع المعزّز" وإيقافها
تكون ميزة ARR مفعَّلة تلقائيًا لتحسين كفاءة استهلاك الطاقة. على الرغم من إمكانية إيقاف هذه الميزة، لا يُنصح بذلك لأنّ التطبيق سيستهلك المزيد من الطاقة. ننصحك بعدم إيقاف هذه الميزة إلا إذا واجهت مشاكل تؤثر بشكل كبير في تجربة المستخدم.
لتفعيل ميزة "التقييم حسب الفئة العمرية" أو إيقافها، استخدِم واجهة برمجة التطبيقات
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>
ARR for Compose
يوفّر الإصدار 1.9 من Compose أيضًا إمكانية استخدام معدّل التحديث التكيّفي.
في نظام View، يمكنك استخدام الطريقة setRequestedFrameRate()
لطلب معدّل لقطات معيّن لعرض View. في Compose، يتيح لك معدِّل جديد تحديد عدد اللقطات في الثانية لعنصر قابل للإنشاء. تعمل أداة التعديل هذه بشكل مشابه لأداة setRequestedFrameRate()
، إذ تقبل إما قيمة موجبة لعدد اللقطات في الثانية (بالهرتز) أو فئة محدّدة مسبقًا لعدد اللقطات في الثانية، FrameRateCategory
.
في ما يلي تواقيع واجهات برمجة التطبيقات:
Modifier.preferredFrameRate(frameRate: Float)
Modifier.preferredFrameRate(frameRateCategory: FrameRateCategory)
في المقتطف أدناه، يتم تطبيق معدِّل عدد اللقطات في الثانية الجديد (Modifier.requestedFrameRate(120f))
على عنصر Text
قابل للإنشاء. تتسبّب أداة التعديل هذه في أن يطلب العنصر القابل للإنشاء Text
معدّل إطارات مفضّلاً يبلغ 120 عند الرسم أو إنشاء الرسوم المتحركة (على سبيل المثال، مع تغييرات التعتيم):
var targetAlpha by remember { mutableFloatStateOf(1f) }
val alpha by
animateFloatAsState(
targetValue = targetAlpha,
animationSpec = tween(durationMillis = 1000)
)
Button(
onClick = { targetAlpha = if (targetAlpha == 1f) 0.2f else 1f },
modifier =
Modifier.background(LocalContentColor.current.copy(alpha = alpha))
) {
Text(
text = "Click",
color = LocalContentColor.current.copy(alpha = alpha),
modifier = Modifier.preferredFrameRate(120f)
// You can also pass frame rate category such as FrameRateCategory.High to increase the frame rate
)
}
بعد ذلك، يتم جمع معدّلات عرض اللقطات المفضّلة من جميع العناصر القابلة للإنشاء ودمجها لتحديد معدّل عرض اللقطات النهائي لكل لقطة. لمزيد من التفاصيل، يُرجى الاطّلاع على SetFrameRateSample
وSetFrameRateCategorySample
.