फ़्रेम दर

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

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

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

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

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

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

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

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

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

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

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

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

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

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

कुछ और सुझाव

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

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

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

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

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

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

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

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

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

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

setFrameRate() बनाम पसंदीदाDisplayModeId

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

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

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

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

setFrameRate() बनाम निजी रीफ़्रेश दर

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

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

preferredRefreshRate बनाम preferredDisplayModeId

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

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

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

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

setFrameRate() एपीआई का इस्तेमाल मुख्य रूप से वीडियो के लिए किया जाता है. हालांकि, इसका इस्तेमाल अन्य ऐप्लिकेशन के लिए भी किया जा सकता है. उदाहरण के लिए, कोई गेम जो 60 हर्ट्ज़ (पावर का इस्तेमाल कम करने और लंबे समय तक वीडियो चलाने के सेशन के लिए) के ज़रिए कॉल किया जा सकता है 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. उपयोगकर्ता को सूचित करने के लिए UX दिखाएं. ध्यान दें कि हमारा सुझाव है कि आप उपयोगकर्ता को इस यूज़र एक्सपीरियंस को खारिज करने का तरीका दें. इससे, उपयोगकर्ता को पांचवें चरण के डी में ज़्यादा देरी नहीं करनी पड़ेगी. यह है क्योंकि हमारा सुझाया गया समय, उन डिसप्ले पर ज़रूरत से ज़्यादा है तेज़ी से स्विच करने का समय दिखाते हैं.
    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();

ऊपर बताए गए तरीके से, अपने-आप स्विच होने की सुविधा और बिना अपने-आप स्विच होने की सुविधा के काम करने वाले आभासी कोड का उदाहरण यहां दिया गया है:

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