फ़्रेम दर

फ़्रेम रेट एपीआई की मदद से, ऐप्लिकेशन Android प्लैटफ़ॉर्म को अपने फ़्रेम रेट के बारे में बता सकते हैं. यह एपीआई, Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए उपलब्ध है. आम तौर पर, ज़्यादातर डिवाइसों में डिसप्ले का रिफ़्रेश रेट एक ही होता है. आम तौर पर, यह 60Hz होता है. हालांकि, अब इसमें बदलाव हो रहा है. अब कई डिवाइसों पर, 90Hz या 120Hz जैसे ज़्यादा रिफ़्रेश रेट का इस्तेमाल किया जा सकता है. कुछ डिवाइसों पर, रीफ़्रेश रेट में बिना किसी रुकावट के स्विच किया जा सकता है. वहीं, कुछ डिवाइसों पर रीफ़्रेश रेट बदलने पर, कुछ समय के लिए स्क्रीन काली हो जाती है. आम तौर पर, यह काली स्क्रीन एक सेकंड तक दिखती है.

एपीआई का मुख्य मकसद, ऐप्लिकेशन को डिसप्ले के उन सभी रीफ़्रेश रेट का बेहतर तरीके से फ़ायदा उठाने में मदद करना है जिन पर यह काम करता है. उदाहरण के लिए, setFrameRate() को कॉल करने वाला 24 हर्ट्ज़ का वीडियो चलाने वाला ऐप्लिकेशन, डिवाइस के डिसप्ले के रीफ़्रेश रेट को 60 हर्ट्ज़ से 120 हर्ट्ज़ पर बदल सकता है. नए रिफ़्रेश रेट की मदद से, 24Hz वीडियो को बिना किसी रुकावट के और बिना झटके के चलाया जा सकता है. इसके लिए, 3:2 पुल-डाउन की ज़रूरत नहीं होती. 60Hz डिसप्ले पर उसी वीडियो को चलाने के लिए, पुल-डाउन की ज़रूरत होती है. इससे उपयोगकर्ताओं को बेहतर अनुभव मिलता है.

बुनियादी इस्तेमाल

Android, प्लैटफ़ॉर्म को ऐक्सेस और कंट्रोल करने के कई तरीके उपलब्ध कराता है. इसलिए, setFrameRate() एपीआई के कई वर्शन हैं. एपीआई के हर वर्शन में एक जैसे पैरामीटर इस्तेमाल किए जाते हैं और यह दूसरे वर्शन की तरह ही काम करता है:

ऐप्लिकेशन को डिसप्ले के काम करने वाले रीफ़्रेश रेट पर ध्यान देने की ज़रूरत नहीं है. setFrameRate() को सुरक्षित तरीके से कॉल करने के लिए, Display.getSupportedModes() को कॉल करके, डिसप्ले के रीफ़्रेश रेट की जानकारी हासिल की जा सकती है. उदाहरण के लिए, अगर डिवाइस पर सिर्फ़ 60Hz की सुविधा काम करती है, तब भी setFrameRate() को उस फ़्रेम रेट के साथ कॉल करें जो आपके ऐप्लिकेशन के हिसाब से सही है. जिन डिवाइसों पर ऐप्लिकेशन के फ़्रेम रेट के हिसाब से बेहतर रीफ़्रेश रेट नहीं है उन पर डिसप्ले का मौजूदा रीफ़्रेश रेट ही रहेगा.

setFrameRate() को कॉल करने पर, डिसप्ले के रीफ़्रेश रेट में बदलाव होता है या नहीं, यह देखने के लिए डिसप्ले में बदलाव होने की सूचनाएं पाने के लिए रजिस्टर करें. इसके लिए, DisplayManager.registerDisplayListener() या AChoreographer_registerRefreshRateCallback() को कॉल करें.

setFrameRate() को कॉल करते समय, पूर्णांक में राउंड करने के बजाय, सटीक फ़्रेम रेट में पास करना बेहतर होता है. उदाहरण के लिए, 29.97Hz पर रिकॉर्ड किए गए वीडियो को रेंडर करते समय, उसे 30 पर राउंड करने के बजाय 29.97 पर पास करें.

वीडियो ऐप्लिकेशन के लिए, setFrameRate() में पास किए गए, डिवाइस के साथ काम करने की सुविधा वाले पैरामीटर को Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE पर सेट किया जाना चाहिए. इससे Android प्लैटफ़ॉर्म को यह अतिरिक्त जानकारी मिलती है कि ऐप्लिकेशन, डिसप्ले के रिफ़्रेश रेट के हिसाब से अडजस्ट करने के लिए, पुल-डाउन का इस्तेमाल करेगा. इसकी वजह से, वीडियो में झटके आ सकते हैं.

कुछ मामलों में, वीडियो प्लैटफ़ॉर्म फ़्रेम सबमिट करना बंद कर देगा. हालांकि, वह कुछ समय तक स्क्रीन पर दिखता रहेगा. आम तौर पर, ऐसा तब होता है, जब वीडियो वीडियो के आखिर तक पहुंच जाए या जब उपयोगकर्ता वीडियो को रोक दे. इन मामलों में, setFrameRate() को कॉल करें. इसके लिए, फ़्रेम रेट पैरामीटर को 0 पर सेट करें, ताकि प्लैटफ़ॉर्म के फ़्रेम रेट की सेटिंग को डिफ़ॉल्ट वैल्यू पर वापस लाया जा सके. फ़्रेम रेट की सेटिंग को इस तरह से मिटाना ज़रूरी नहीं है, जब सरफ़ेस को हटाया जा रहा हो या जब उपयोगकर्ता किसी दूसरे ऐप्लिकेशन पर स्विच करने की वजह से सरफ़ेस छिपा हो. फ़्रेम रेट की सेटिंग को सिर्फ़ तब मिटाएं, जब सरफ़ेस का इस्तेमाल किए बिना ही वह दिखता रहे.

फ़्रेम रेट में बिना किसी रुकावट के स्विच न होना

कुछ डिवाइसों पर, रीफ़्रेश रेट स्विच करने पर, विज़ुअल में रुकावट आ सकती है. जैसे, एक या दो सेकंड के लिए स्क्रीन का काला होना. आम तौर पर, यह समस्या सेट-टॉप बॉक्स, टीवी पैनल, और मिलते-जुलते डिवाइसों पर होती है. डिफ़ॉल्ट रूप से, Android फ़्रेमवर्क Surface.setFrameRate() एपीआई को कॉल करने पर, मोड स्विच नहीं करता. ऐसा इसलिए किया जाता है, ताकि विज़ुअल में रुकावट न आए.

कुछ उपयोगकर्ता लंबी अवधि के वीडियो की शुरुआत और आखिर में विज्ञापन देखना पसंद करते हैं. इससे डिसप्ले का रीफ़्रेश रेट, वीडियो के फ़्रेम रेट से मैच हो पाता है. साथ ही, फ़िल्म चलाने के दौरान 3:2 पुल-डाउन जडर जैसे फ़्रेम रेट कन्वर्ज़न आर्टफ़ैक्ट से बचा जा सकता है.

इस वजह से, रिफ़्रेश रेट के बीच स्विच करने की सुविधा को तब चालू किया जा सकता है, जब उपयोगकर्ता और ऐप्लिकेशन, दोनों के लिए यह सुविधा चालू की गई हो:

हमारा सुझाव है कि फ़िल्मों जैसे लंबी अवधि वाले वीडियो के लिए, हमेशा CHANGE_FRAME_RATE_ALWAYS का इस्तेमाल करें. ऐसा इसलिए है, क्योंकि वीडियो फ़्रेम रेट को मैच करने का फ़ायदा, रीफ़्रेश रेट बदलने पर होने वाली रुकावट से ज़्यादा होता है.

कुछ और सुझाव

सामान्य स्थितियों के लिए इन सुझावों को अपनाएं.

एक से ज़्यादा प्लैटफ़ॉर्म

Android प्लैटफ़ॉर्म को उन स्थितियों को सही तरीके से मैनेज करने के लिए डिज़ाइन किया गया है जहां अलग-अलग फ़्रेम रेट सेटिंग वाले कई प्लैटफ़ॉर्म होते हैं. अगर आपके ऐप्लिकेशन में अलग-अलग फ़्रेम रेट वाले कई प्लैटफ़ॉर्म हैं, तो हर प्लैटफ़ॉर्म के लिए सही फ़्रेम रेट के साथ setFrameRate() को कॉल करें. भले ही, डिवाइस पर स्प्लिट स्क्रीन या पिक्चर में पिक्चर मोड का इस्तेमाल करके एक साथ कई ऐप्लिकेशन चलाए जा रहे हों, हर ऐप्लिकेशन अपने प्लैटफ़ॉर्म पर setFrameRate() को सुरक्षित तरीके से कॉल कर सकता है.

प्लैटफ़ॉर्म, ऐप्लिकेशन के फ़्रेम रेट में नहीं बदलता

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

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

अगर ऐप्लिकेशन, डिसप्ले के रीफ़्रेश रेट पर नहीं चलता या चल नहीं सकता, तो ऐप्लिकेशन को हर फ़्रेम के लिए प्रज़ेंटेशन टाइमस्टैंप बताने चाहिए. इसके लिए, प्रज़ेंटेशन टाइमस्टैंप सेट करने के लिए, प्लैटफ़ॉर्म के किसी एक तरीके का इस्तेमाल करें:

इन टाइमस्टैंप का इस्तेमाल करने से, प्लैटफ़ॉर्म किसी ऐप्लिकेशन फ़्रेम को बहुत जल्दी दिखाना बंद कर देता है. इससे ऐप्लिकेशन में झटके आ सकते हैं. फ़्रेम के प्रज़ेंटेशन टाइमस्टैंप का सही इस्तेमाल करना थोड़ा मुश्किल है. गेम के लिए, ज़्यादा जानकारी के लिए हमारी फ़्रेम पेसिंग गाइड देखें. इससे आपको गेम में रुकावट आने से रोकने में मदद मिलेगी. साथ ही, Android फ़्रेम पेसिंग लाइब्रेरी का इस्तेमाल करें.

कुछ मामलों में, प्लैटफ़ॉर्म, ऐप्लिकेशन के setFrameRate() में बताए गए फ़्रेम रेट के मल्टीपल पर स्विच कर सकता है. उदाहरण के लिए, कोई ऐप्लिकेशन setFrameRate() को 60 हर्ट्ज़ पर कॉल कर सकता है और डिवाइस डिसप्ले को 120 हर्ट्ज़ पर स्विच कर सकता है. ऐसा होने की एक वजह यह हो सकती है कि किसी दूसरे ऐप्लिकेशन में 24Hz की फ़्रेम रेट सेटिंग वाला कोई प्लैटफ़ॉर्म हो. ऐसे में, डिसप्ले को 120 हर्ट्ज़ पर चलाने से, 60 हर्ट्ज़ और 24 हर्ट्ज़, दोनों तरह के डिसप्ले बिना किसी पुल-डाउन के चल पाएंगे.

जब डिसप्ले, ऐप्लिकेशन के फ़्रेम रेट से कई गुना तेज़ी से चल रहा हो, तो ऐप्लिकेशन को हर फ़्रेम के लिए प्रज़ेंटेशन टाइमस्टैंप बताने चाहिए, ताकि ग़ैर-ज़रूरी झटके से बचा जा सके. गेम के लिए, Android फ़्रेम पेसिंग लाइब्रेरी, फ़्रेम प्रज़ेंटेशन टाइमस्टैंप को सही तरीके से सेट करने में मदद करती है.

setFrameRate() बनाम preferredDisplayModeId

WindowManager.LayoutParams.preferredDisplayModeId एक और तरीका है जिससे ऐप्लिकेशन, प्लैटफ़ॉर्म को अपना फ़्रेम रेट बता सकते हैं. कुछ ऐप्लिकेशन, डिसप्ले रिज़ॉल्यूशन जैसी डिसप्ले मोड की अन्य सेटिंग बदलने के बजाय, सिर्फ़ डिसप्ले रीफ़्रेश रेट बदलना चाहते हैं. आम तौर पर, preferredDisplayModeId के बजाय setFrameRate() का इस्तेमाल करें. setFrameRate() फ़ंक्शन का इस्तेमाल करना आसान है, क्योंकि ऐप्लिकेशन को किसी खास फ़्रेम रेट वाले मोड को ढूंढने के लिए, डिसप्ले मोड की सूची में खोजने की ज़रूरत नहीं पड़ती.

setFrameRate() की मदद से, प्लैटफ़ॉर्म को उन स्थितियों में काम करने वाला फ़्रेम रेट चुनने के ज़्यादा अवसर मिलते हैं जहां एक से ज़्यादा डिवाइस अलग-अलग फ़्रेम रेट पर काम कर रहे हों. उदाहरण के लिए, मान लें कि Pixel 4 पर दो ऐप्लिकेशन, स्प्लिट-स्क्रीन मोड में चल रहे हैं. इनमें से एक ऐप्लिकेशन 24Hz वीडियो चला रहा है और दूसरा ऐप्लिकेशन, उपयोगकर्ता को स्क्रोल की जा सकने वाली सूची दिखा रहा है. Pixel 4 में डिसप्ले के दो रीफ़्रेश रेट काम करते हैं: 60 हर्ट्ज़ और 90 हर्ट्ज़. preferredDisplayModeId एपीआई का इस्तेमाल करने पर, वीडियो प्लैटफ़ॉर्म को 60Hz या 90Hz में से किसी एक को चुनना पड़ता है. वीडियो प्लैटफ़ॉर्म को setFrameRate() को 24 हर्ट्ज़ पर कॉल करने पर, प्लैटफ़ॉर्म को सोर्स वीडियो के फ़्रेम रेट के बारे में ज़्यादा जानकारी मिलती है. इससे प्लैटफ़ॉर्म को डिसप्ले रीफ़्रेश दर के लिए 90 हर्ट्ज़ की दर तय करने में मदद मिलती है, जो इस स्थिति में 60 हर्ट्ज़ से बेहतर है.

हालांकि, कुछ मामलों में setFrameRate() के बजाय preferredDisplayModeId का इस्तेमाल किया जाना चाहिए. जैसे:

  • अगर ऐप्लिकेशन को रिज़ॉल्यूशन या डिसप्ले मोड की अन्य सेटिंग बदलनी है, तो preferredDisplayModeId का इस्तेमाल करें.
  • प्लैटफ़ॉर्म, setFrameRate() को कॉल करने पर डिसप्ले मोड को सिर्फ़ तब स्विच करेगा, जब मोड स्विच करना आसान हो और उपयोगकर्ता को इसका पता न चले. अगर ऐप्लिकेशन के लिए डिसप्ले रीफ़्रेश दर पर स्विच करना ज़रूरी है, भले ही इसके लिए बहुत ज़्यादा मोड वाले स्विच की ज़रूरत हो (उदाहरण के लिए, Android TV डिवाइस पर), तो preferredDisplayModeId का इस्तेमाल करें.
  • ऐसे ऐप्लिकेशन जो ऐप्लिकेशन के फ़्रेम रेट के एक से ज़्यादा फ़्रेम रेट पर चल रहे डिसप्ले को हैंडल नहीं कर सकते और इसके लिए, हर फ़्रेम पर प्रज़ेंटेशन के टाइमस्टैंप सेट करने होंगे. इसके लिए, preferredDisplayModeId का इस्तेमाल करना चाहिए.

setFrameRate() बनाम preferredRefreshRate

WindowManager.LayoutParams#preferredRefreshRate, ऐप्लिकेशन की विंडो पर पसंदीदा फ़्रेम रेट सेट करता है. साथ ही, यह रेट विंडो में मौजूद सभी प्लैटफ़ॉर्म पर लागू होता है. ऐप्लिकेशन को अपने पसंदीदा फ़्रेम रेट की जानकारी देनी चाहिए. भले ही, डिवाइस पर setFrameRate() जैसे रीफ़्रेश रेट काम करते हों. इससे शेड्यूलर को ऐप्लिकेशन के फ़्रेम रेट के बारे में बेहतर जानकारी मिलती है.

setFrameRate() का इस्तेमाल करने वाले Surfaces के लिए, preferredRefreshRate को अनदेखा किया जाता है. अगर हो सके, तो आम तौर पर setFrameRate() का इस्तेमाल करें.

PreferredRate बनाम पसंदीदा DisplayModeId

अगर ऐप्लिकेशन सिर्फ़ पसंदीदा रीफ़्रेश रेट बदलना चाहते हैं, तो preferredDisplayModeId के बजाय preferredRefreshRate का इस्तेमाल करना बेहतर होता है.

setFrameRate() को बार-बार कॉल करने से बचना

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

गेम या वीडियो वाले ऐप्लिकेशन के अलावा अन्य ऐप्लिकेशन के लिए इस्तेमाल करना

setFrameRate() एपीआई का इस्तेमाल मुख्य रूप से वीडियो के लिए किया जाता है. हालांकि, इसका इस्तेमाल अन्य ऐप्लिकेशन के लिए भी किया जा सकता है. उदाहरण के लिए, कोई ऐसा गेम जो 60Hz से ज़्यादा पर न चलने के लिए (बिजली की खपत कम करने और गेमप्ले के लंबे सेशन के लिए) Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT) को कॉल कर सकता है. इस तरह, डिफ़ॉल्ट रूप से 90Hz पर चलने वाला डिवाइस, गेम के चालू होने पर 60Hz पर चलेगा. इससे, डिसप्ले के 90Hz पर चलने के दौरान गेम के 60Hz पर चलने से होने वाली झटके वाली फ़ील से बचा जा सकेगा.

FRAME_RATE_COMPATIBILITY_FIXED_SOURCE का इस्तेमाल

FRAME_RATE_COMPATIBILITY_FIXED_SOURCE सिर्फ़ वीडियो ऐप्लिकेशन के लिए है. वीडियो के अलावा, किसी और काम के लिए ट्रैक का इस्तेमाल करने के लिए, FRAME_RATE_COMPATIBILITY_DEFAULT का इस्तेमाल करें.

फ़्रेम रेट बदलने के लिए रणनीति चुनना

  • हमारा सुझाव है कि ऐप्लिकेशन, लंबी अवधि के वीडियो, जैसे कि फ़िल्में दिखाते समय setFrameRate(fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS) को कॉल करें. यहां fps, वीडियो का फ़्रेम रेट होता है.
  • हमारा सुझाव है कि अगर आपको लगता है कि वीडियो प्लेबैक कुछ मिनट या उससे कम समय तक चलेगा, तो ऐप्लिकेशन CHANGE_FRAME_RATE_ALWAYS के साथ setFrameRate() को कॉल न करें.

वीडियो चलाने वाले ऐप्लिकेशन के लिए इंटिग्रेशन का उदाहरण

वीडियो चलाने वाले ऐप्लिकेशन में रीफ़्रेश दर वाले स्विच को इंटिग्रेट करने के लिए, यह तरीका अपनाएं:

  1. changeFrameRateStrategy तय करें:
    1. अगर कोई लंबा वीडियो चलाना है, जैसे कि कोई फ़िल्म, तो MATCH_CONTENT_FRAMERATE_ALWAYS का इस्तेमाल करें
    2. अगर आपको कोई शॉर्ट वीडियो चलाना है, जैसे कि मूवी का ट्रेलर, तो CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS का इस्तेमाल करें
  2. अगर changeFrameRateStrategy CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS है, तो चौथे चरण पर जाएं.
  3. रीफ़्रेश दर में बदलाव न होने पर, इसका पता लगाएं कि ये दोनों बातें सही हैं या नहीं:
    1. मौजूदा रिफ़्रेश रेट (इसे C कहें) से वीडियो के फ़्रेम रेट (इसे V कहें) पर, बिना किसी रुकावट के स्विच नहीं किया जा सकता. ऐसा तब होगा, जब C और V अलग-अलग हों और Display.getMode().getAlternativeRefreshRates में V का कोई गुणक न हो.
    2. उपयोगकर्ता ने रीफ़्रेश दर में आसानी से न होने वाले बदलावों के लिए ऑप्ट-इन किया है. इसकी पुष्टि करने के लिए, देखें कि DisplayManager.getMatchContentFrameRateUserPreference का नतीजा MATCH_CONTENT_FRAMERATE_ALWAYS है या नहीं
  4. अगर स्विच करना आसान नहीं है, तो ये काम करें:
    1. setFrameRate को कॉल करें और fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, और changeFrameRateStrategy पास करें, जहां fps, वीडियो का फ़्रेम रेट है.
    2. वीडियो चलाना
  5. अगर कोई ऐसा बदलाव होने वाला है जो आसानी से नहीं हो सकता, तो ये काम करें:
    1. उपयोगकर्ता को सूचना देने के लिए, यूज़र एक्सपीरियंस दिखाएं. ध्यान दें कि हमारा सुझाव है कि आप उपयोगकर्ता को इस यूज़र एक्सपीरियंस को खारिज करने का तरीका दें. इससे, उपयोगकर्ता को पांचवें चरण के डी में अतिरिक्त देरी नहीं करनी पड़ेगी. ऐसा इसलिए है, क्योंकि हमारे सुझाए गए विलंब की अवधि, तेज़ी से स्विच करने वाले डिसप्ले के लिए ज़रूरत से ज़्यादा है.
    2. setFrameRate को कॉल करें और उसे fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, और CHANGE_FRAME_RATE_ALWAYS पास करें. यहां fps, वीडियो का फ़्रेम रेट है.
    3. onDisplayChanged कॉलबैक का इंतज़ार करें.
    4. मोड स्विच होने में दो सेकंड लगेंगे.
    5. वीडियो चलाना

आसानी से स्विच करने की सुविधा के लिए, सिर्फ़ सूडो-कोड इस तरह का होना चाहिए:

SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
transaction.setFrameRate(surfaceControl,
    contentFrameRate,
    FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
    CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();

बिना किसी रुकावट के और आसानी से स्विच करने की सुविधा के लिए, ऊपर बताए गए pseudo-code के बारे में यहां बताया गया है:

SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
if (isSeamlessSwitch(contentFrameRate)) {
  transaction.setFrameRate(surfaceControl,
      contentFrameRate,
      FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
      CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
  transaction.apply();
  beginPlayback();
} else if (displayManager.getMatchContentFrameRateUserPreference()
      == MATCH_CONTENT_FRAMERATE_ALWAYS) {
  showRefreshRateSwitchUI();
  sleep(shortDelaySoUserSeesUi);
  displayManager.registerDisplayListener();
  transaction.setFrameRate(surfaceControl,
      contentFrameRate,
      FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
      CHANGE_FRAME_RATE_ALWAYS);
  transaction.apply();
  waitForOnDisplayChanged();
  sleep(twoSeconds);
  hideRefreshRateSwitchUI();
  beginPlayback();
}