अडैप्टिव रीफ़्रेश रेट की मदद से फ़्रेम रेट को ऑप्टिमाइज़ करना

Android में ऐनिमेशन शुरू होने पर, डिसप्ले को अक्सर ज़्यादा से ज़्यादा रीफ़्रेश रेट पर सेट किया जाता है, ताकि बेहतर अनुभव मिल सके. प्रोग्रेस बार और ऑडियो विज़ुअलाइज़र जैसे छोटे ऐनिमेशन के लिए, यह ज़्यादा रीफ़्रेश रेट ज़रूरी नहीं है. इससे डिवाइस की बैटरी तेज़ी से खर्च होती है.

Android 15 में, अडैप्टिव रीफ़्रेश रेट (एआरआर) की सुविधा के साथ, चालू किए गए डिवाइसों पर ज़्यादा रीफ़्रेश रेट की अवधि को दो तरीकों से कम किया जा सकता है:

  • प्लैटफ़ॉर्म के फ़्रेम रेट मैनेजमेंट के नए ऑप्टिमाइज़ेशन की मदद से, ऐप्लिकेशन डिफ़ॉल्ट रूप से कम फ़्रेम रेट पर रेंडर हो सकते हैं. साथ ही, ज़रूरत पड़ने पर ही ज़्यादा फ़्रेम रेट पर रेंडर हो सकते हैं.
  • डिसप्ले की रीफ़्रेश दर, कॉन्टेंट के रेंडर रेट से डाइनैमिक तरीके से मैच होती है.

ज़्यादातर ऐप्लिकेशन को बिना किसी बदलाव के, एआरआर (ऐप्लिकेशन रिस्पॉन्स रेट) का फ़ायदा मिलना चाहिए. हालांकि, ज़रूरत पड़ने पर डिफ़ॉल्ट फ़्रेम रेट के व्यवहार को बदला भी जा सकता है.

इस पेज पर इनके बारे में बताया गया है:

  • हर व्यू का फ़्रेम रेट कैसे तय किया जाता है.
  • एआरआर यह तय करता है कि फ़्रेम रेट किस पर सेट किया जाए. इसके लिए, सामान्य नीति का इस्तेमाल किया जाता है.
  • फ़्रेम रेट के डिफ़ॉल्ट व्यवहार को मैन्युअल तरीके से बदलने का तरीका.

व्यू के लिए वोटिंग का तरीका

Android के व्यू सिस्टम में, यूज़र इंटरफ़ेस (यूआई) के लेआउट में मौजूद हर व्यू के लिए, पसंदीदा फ़्रेम रेट सेट किया जा सकता है. इन सेटिंग को इकट्ठा करके, हर फ़्रेम के लिए फ़ाइनल फ़्रेम रेट तय किया जाता है. यह वोटिंग की सुविधा के ज़रिए किया जाता है. इसमें हर व्यू, अपने फ़्रेम रेट एट्रिब्यूट के आधार पर वोट करता है. यह एट्रिब्यूट, कोई कैटगरी या कोई खास रेट हो सकता है. आम तौर पर, ड्रॉ होने या अपडेट होने पर व्यू वोट करते हैं. इन वोट को मिलाकर फ़ाइनल फ़्रेम रेट तय किया जाता है. इसके बाद, इसे रेंडरिंग के लिए हिंट के तौर पर, निचले लेवल की लेयर पर भेजा जाता है.

फ़िलहाल, ज़्यादातर व्यू डिफ़ॉल्ट रूप से "सामान्य" फ़्रेम रेट पर सेट होते हैं. आम तौर पर, इसे 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 Hz और 90 Hz — तो फ़ाइनल फ़्रेम रेट के तौर पर 90 Hz चुना जाता है.
  • एक-दूसरे के मल्टीपल न हों:
    • अगर किसी भी वोट की फ़्रीक्वेंसी 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 Hz पर दिखाए जाते हैं. इसकी वजह यह है कि हर व्यू में, पसंदीदा फ़्रेम रेट के तौर पर "सामान्य" सेट होता है. हालांकि, कुछ मामलों में फ़्रेम रेट को "ज़्यादा" पर सेट किया जाता है, ताकि ऐनिमेशन बेहतर तरीके से चल सकें.

आरआर (रेवेन्यू के अनुपात में खर्च) से जुड़ी सामान्य नीति इस तरह है:

  • टच बूस्टर: जब कोई टच इवेंट (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()

स्क्रोल करने की सुविधा को बेहतर बनाना

फ़्रेम रेट को डाइनैमिक तरीके से ऑप्टिमाइज़ करने का एक मुख्य उदाहरण, स्क्रीन पर स्क्रोल करने (फ़्लिंग) के अनुभव को बेहतर बनाना है. कई ऐप्लिकेशन, नया कॉन्टेंट देखने के लिए, उपयोगकर्ताओं के ऊपर की ओर स्वाइप करने पर काम करते हैं. फ़्लिंग जेस्चर के धीमे होने पर, एआरआर स्क्रोलिंग बेहतर करने की सुविधा, रीफ़्रेश रेट को डाइनैमिक तौर पर अडजस्ट करती है. इससे फ़्रेम रेट धीरे-धीरे कम होता जाता है. इससे स्क्रीन पर आसानी से स्क्रोल करने के साथ-साथ, बेहतर तरीके से रेंडरिंग की सुविधा मिलती है.

यह सुधार खास तौर पर स्क्रोल किए जा सकने वाले यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट पर लागू होता है. इनमें ScrollView, ListView, और GridView शामिल हैं. ऐसा हो सकता है कि यह सभी कस्टम लागू करने के लिए उपलब्ध न हो.

ARR स्क्रोलिंग की सुविधा, RecyclerView और NestedScrollView के लिए उपलब्ध है. अपने ऐप्लिकेशन में इस सुविधा को चालू करने के लिए, AndroidX.recyclerview और AndroidX.core के नए वर्शन पर अपग्रेड करें. ज़्यादा जानकारी के लिए, नीचे दी गई टेबल देखें.

लाइब्रेरी

वर्शन

AndroidX.recyclerview

1.4.0

AndroidX.core

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 को चालू या बंद करने के लिए, Window पर setFrameRatePowerSavingsBalanced() एपीआई का इस्तेमाल करें या अपनी styles.xml फ़ाइल के ज़रिए isFrameRatePowerSavingsBalanced() एपीआई का इस्तेमाल करें.

नीचे दिए गए स्निपेट में, Window पर ARR को चालू या बंद करने का तरीका बताया गया है:

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()

styles.xml फ़ाइल की मदद से आरआर को बंद करने के लिए, res/values/styles.xml में अपनी स्टाइल में यह आइटम जोड़ें:

<style name="frameRatePowerSavingsBalancedDisabled">
    <item name="android:windowIsFrameRatePowerSavingsBalanced">false</item>
</style>