फ़्रेम दर

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

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

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

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

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

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

setFrameRate() को कॉल करते समय, पूर्णांक में राउंड करने के बजाय, सटीक फ़्रेम रेट पास करना सबसे सही रहता है. उदाहरण के लिए, 29.97 हर्ट्ज़ पर रिकॉर्ड किए गए वीडियो को रेंडर करते समय, 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 Frame Pacing लाइब्रेरी का इस्तेमाल करें.

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

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

setFrameRate() बनाम preferredDisplayModeId

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

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

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

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

setFrameRate() बनाम preferredRefreshRate

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

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

preferredRefreshRate बनाम preferredDisplayModeId

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

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

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

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

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

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. वीडियो चलाना

सिर्फ़ अपने-आप स्विच होने की सुविधा के लिए, pseudo-code यहां दिया गया है:

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