फ़्रेम रेट एपीआई की मदद से, ऐप्लिकेशन Android प्लैटफ़ॉर्म को अपने फ़्रेम रेट के बारे में बता सकते हैं. यह एपीआई, Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए उपलब्ध है. आम तौर पर, ज़्यादातर डिवाइसों में डिसप्ले का रिफ़्रेश रेट एक ही होता है. आम तौर पर, यह 60Hz होता है. हालांकि, अब इसमें बदलाव हो रहा है. कई डिवाइसों पर अब 90 हर्ट्ज़ या 120 हर्ट्ज़ जैसी अतिरिक्त रीफ़्रेश दरें काम करती हैं. कुछ डिवाइसों पर, रीफ़्रेश रेट में बिना किसी रुकावट के स्विच किया जा सकता है. वहीं, कुछ डिवाइसों पर रीफ़्रेश रेट बदलने पर, कुछ समय के लिए स्क्रीन काली हो जाती है. आम तौर पर, यह काली स्क्रीन एक सेकंड तक दिखती है.
इस एपीआई का मुख्य मकसद ऐप्लिकेशन को उपलब्ध कराना है, ताकि वे डिसप्ले की रीफ़्रेश दरों का ज़्यादा से ज़्यादा फ़ायदा पा सकें. उदाहरण के लिए, setFrameRate()
को कॉल करने वाला 24 हर्ट्ज़ का वीडियो चलाने वाला ऐप्लिकेशन, डिवाइस के डिसप्ले के रीफ़्रेश रेट को 60 हर्ट्ज़ से 120 हर्ट्ज़ पर बदल सकता है. इस नई रीफ़्रेश दर से 24 हर्ट्ज़ पर बिना किसी रुकावट के वीडियो चलाया जा सकता है. इसके लिए, 3:2 पुलडाउन की ज़रूरत नहीं होती और उसी वीडियो को 60 हर्ट्ज़ के डिसप्ले पर चलाने के लिए इसकी ज़रूरत होती है. इससे उपयोगकर्ताओं को बेहतर अनुभव मिलता है.
बुनियादी इस्तेमाल
Android, प्लैटफ़ॉर्म को ऐक्सेस और कंट्रोल करने के कई तरीके उपलब्ध कराता है. इसलिए, setFrameRate()
एपीआई के कई वर्शन हैं. एपीआई के हर वर्शन में एक जैसे पैरामीटर इस्तेमाल किए जाते हैं और यह दूसरे वर्शन की तरह ही काम करता है:
Surface.setFrameRate()
SurfaceControl.Transaction.setFrameRate()
ANativeWindow_setFrameRate()
ASurfaceTransaction_setFrameRate()
ऐप्लिकेशन को डिसप्ले के काम करने वाले रीफ़्रेश रेट पर ध्यान देने की ज़रूरत नहीं है. setFrameRate()
को सुरक्षित तरीके से कॉल करने के लिए, Display.getSupportedModes()
को कॉल करके, डिसप्ले के रीफ़्रेश रेट की जानकारी हासिल की जा सकती है. उदाहरण के लिए, भले ही डिवाइस सिर्फ़ 60 हर्ट्ज़ पर काम करता हो, फिर भी 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
कोsetFrameRate()
में भेज सकते हैं.
हमारा सुझाव है कि फ़िल्मों जैसे लंबी अवधि वाले वीडियो के लिए, हमेशा CHANGE_FRAME_RATE_ALWAYS
का इस्तेमाल करें. ऐसा इसलिए होता है, क्योंकि रीफ़्रेश दर में बदलाव करते समय होने वाली रुकावट से
वीडियो के फ़्रेम रेट को मैच करने का फ़ायदा ज़्यादा होता है.
कुछ और सुझाव
सामान्य स्थितियों के लिए इन सुझावों को अपनाएं.
एक से ज़्यादा प्लैटफ़ॉर्म
Android प्लैटफ़ॉर्म को उन स्थितियों को सही तरीके से मैनेज करने के लिए डिज़ाइन किया गया है जहां अलग-अलग फ़्रेम रेट सेटिंग वाले कई प्लैटफ़ॉर्म होते हैं. अगर आपके ऐप्लिकेशन में अलग-अलग फ़्रेम रेट वाले कई प्लैटफ़ॉर्म हैं, तो हर प्लैटफ़ॉर्म के लिए सही फ़्रेम रेट के साथ setFrameRate()
को कॉल करें. भले ही, डिवाइस पर स्प्लिट स्क्रीन या पिक्चर में पिक्चर मोड का इस्तेमाल करके, एक साथ कई ऐप्लिकेशन चल रहे हों, फिर भी हर ऐप्लिकेशन अपने प्लैटफ़ॉर्म के लिए setFrameRate()
को सुरक्षित तरीके से कॉल कर सकता है.
प्लैटफ़ॉर्म, ऐप्लिकेशन के फ़्रेम रेट में नहीं बदलता
भले ही, डिवाइस उस फ़्रेम रेट के साथ काम करता हो जिसे ऐप्लिकेशन setFrameRate()
को कॉल में बताता है, लेकिन कुछ मामलों में डिवाइस डिसप्ले को उस रिफ़्रेश रेट पर स्विच नहीं करेगा. उदाहरण के लिए, ज़्यादा प्राथमिकता वाले प्लैटफ़ॉर्म पर फ़्रेम रेट की सेटिंग अलग हो सकती है या डिवाइस बैटरी सेवर मोड में हो सकता है. बैटरी सेवर मोड में, डिसप्ले के रीफ़्रेश रेट पर पाबंदी लगाई जाती है, ताकि बैटरी बचाई जा सके. अगर डिवाइस, डिसप्ले के रीफ़्रेश रेट को ऐप्लिकेशन के फ़्रेम रेट की सेटिंग पर स्विच नहीं करता है, तब भी ऐप्लिकेशन को सही तरीके से काम करना चाहिए. भले ही, डिवाइस सामान्य परिस्थितियों में स्विच करता हो.
यह ऐप्लिकेशन को तय करना होगा कि डिसप्ले की रीफ़्रेश दर और ऐप्लिकेशन के फ़्रेम रेट में अंतर होने पर, किस तरह से जवाब दिया जाए. वीडियो के लिए, फ़्रेम रेट को सोर्स वीडियो के हिसाब से तय किया जाता है. साथ ही, वीडियो कॉन्टेंट दिखाने के लिए, आपको पुल-डाउन की ज़रूरत होगी. इसके बजाय, कोई गेम अपने पसंदीदा फ़्रेम रेट पर काम करने के बजाय, डिसप्ले के रीफ़्रेश रेट पर काम करने का विकल्प चुन सकता है. ऐप्लिकेशन को setFrameRate()
को भेजी जाने वाली वैल्यू में बदलाव नहीं करना चाहिए. यह ऐप्लिकेशन के पसंदीदा फ़्रेम रेट पर सेट रहना चाहिए. भले ही, ऐप्लिकेशन उन मामलों को कैसे मैनेज करता हो जहां प्लैटफ़ॉर्म, ऐप्लिकेशन के अनुरोध के हिसाब से अडजस्ट नहीं होता. इस तरह, अगर डिसप्ले रीफ़्रेश दरों का इस्तेमाल करने के लिए डिवाइस की शर्तों में बदलाव होता है, तो प्लैटफ़ॉर्म के पास ऐप्लिकेशन की पसंदीदा फ़्रेम दर पर स्विच करने के लिए सही जानकारी होगी.
अगर ऐप्लिकेशन, रीफ़्रेश दर के हिसाब से नहीं चल रहा हो, तो ऐप्लिकेशन को हर फ़्रेम के लिए प्रज़ेंटेशन के टाइमस्टैंप तय करने चाहिए. प्रज़ेंटेशन के टाइमस्टैंप सेट करने के लिए, प्लैटफ़ॉर्म के किसी एक सिस्टम का इस्तेमाल करके, ऐप्लिकेशन को ये टाइमस्टैंप तय करने चाहिए:
इन टाइमस्टैंप का इस्तेमाल करने से, प्लैटफ़ॉर्म किसी ऐप्लिकेशन फ़्रेम को बहुत जल्दी दिखाना बंद कर देता है. इससे ऐप्लिकेशन में झटके आ सकते हैं. फ़्रेम के प्रज़ेंटेशन टाइमस्टैंप का सही इस्तेमाल करना थोड़ा मुश्किल है. गेम के लिए, ज़्यादा जानकारी के लिए हमारी फ़्रेम पेसिंग गाइड देखें. इससे आपको गेम में रुकावट आने से रोकने में मदद मिलेगी. साथ ही, Android फ़्रेम पेसिंग लाइब्रेरी का इस्तेमाल करें.
कुछ मामलों में, प्लैटफ़ॉर्म, ऐप्लिकेशन के setFrameRate()
में बताए गए फ़्रेम रेट के मल्टीपल पर स्विच कर सकता है. उदाहरण के लिए, कोई ऐप्लिकेशन 60 हर्ट्ज़ पर setFrameRate()
को कॉल कर सकता है और डिवाइस, डिसप्ले को 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()
. इससे शेड्यूलर को ऐप्लिकेशन के मुताबिक सेट किए गए फ़्रेम रेट के बारे में बेहतर जानकारी मिल पाएगी.
preferredRefreshRate
को setFrameRate()
का इस्तेमाल करने वाले प्लैटफ़ॉर्म के लिए अनदेखा कर दिया जाता है. आम तौर पर, अगर हो सके, तो setFrameRate()
का इस्तेमाल करें.
PreferredRate बनाम पसंदीदा DisplayModeId
अगर ऐप्लिकेशन सिर्फ़ पसंदीदा रीफ़्रेश दर में बदलाव करना चाहते हैं, तो 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, वीडियो का फ़्रेम रेट होता है. - अगर आपको लगता है कि वीडियो कुछ मिनट या इससे कम समय तक चलेगा, तो हमारा सुझाव है कि
setFrameRate()
कोCHANGE_FRAME_RATE_ALWAYS
कॉल करने वाले ऐप्लिकेशन न इस्तेमाल करें.
वीडियो प्लेबैक ऐप्लिकेशन के लिए इंटिग्रेशन का उदाहरण
हमारा सुझाव है कि वीडियो चलाने वाले ऐप्लिकेशन में रीफ़्रेश रेट स्विच को इंटिग्रेट करने के लिए, यह तरीका अपनाएं:
changeFrameRateStrategy
तय करें:- अगर कोई लंबा वीडियो चलाना है, जैसे कि कोई फ़िल्म, तो
MATCH_CONTENT_FRAMERATE_ALWAYS
का इस्तेमाल करें - अगर आपको कोई शॉर्ट वीडियो चलाना है, जैसे कि मूवी का ट्रेलर, तो
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
का इस्तेमाल करें
- अगर कोई लंबा वीडियो चलाना है, जैसे कि कोई फ़िल्म, तो
- अगर
changeFrameRateStrategy
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
है, तो चौथे चरण पर जाएं. - यह पता लगाएं कि रीफ़्रेश रेट में बिना किसी रुकावट के स्विच होने की संभावना है या नहीं. इसके लिए, यह देखें कि ये दोनों बातें सही हैं या नहीं:
- मौजूदा रीफ़्रेश दर से वीडियो के फ़्रेम रेट (चलिए इसे V कहते हैं) पर, आसान मोड में स्विच नहीं किया जा सकता (चलिए इसे C कहते हैं). ऐसा तब होगा, जब C और V दोनों अलग-अलग हों और
Display.getMode().getAlternativeRefreshRates
में V का मल्टीपल नहीं हो. - उपयोगकर्ता ने रीफ़्रेश रेट में बिना किसी रुकावट के होने वाले बदलावों के लिए ऑप्ट-इन नहीं किया है. इसका पता लगाने के लिए, यह देखें कि
DisplayManager.getMatchContentFrameRateUserPreference
,MATCH_CONTENT_FRAMERATE_ALWAYS
दिखाता है या नहीं
- मौजूदा रीफ़्रेश दर से वीडियो के फ़्रेम रेट (चलिए इसे V कहते हैं) पर, आसान मोड में स्विच नहीं किया जा सकता (चलिए इसे C कहते हैं). ऐसा तब होगा, जब C और V दोनों अलग-अलग हों और
- अगर स्विच करना आसान नहीं है, तो ये काम करें:
setFrameRate
को कॉल करें औरfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, औरchangeFrameRateStrategy
पास करें, जहांfps
, वीडियो का फ़्रेम रेट है.- वीडियो चलाना शुरू करें
- अगर कोई ऐसा बदलाव होने वाला है जो आसानी से नहीं हो सकता, तो ये काम करें:
- उपयोगकर्ता को सूचना देने के लिए, यूज़र एक्सपीरियंस दिखाएं. ध्यान दें कि हमारा सुझाव है कि आप उपयोगकर्ता को इस यूज़र एक्सपीरियंस को खारिज करने का तरीका दें. इससे, उपयोगकर्ता को पांचवें चरण के डी में अतिरिक्त देरी नहीं करनी पड़ेगी. ऐसा इसलिए है, क्योंकि हमारा सुझाव है कि समय को कम करने का सुझाव, उन डिसप्ले पर ज़रूरत से ज़्यादा दिया गया है जिनमें तेज़ी से स्विच करने में समय लगता है.
setFrameRate
को कॉल करें और उसेfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
, औरCHANGE_FRAME_RATE_ALWAYS
पास करें. यहांfps
, वीडियो का फ़्रेम रेट है.onDisplayChanged
कॉलबैक का इंतज़ार करें.- मोड स्विच पूरा होने के लिए दो सेकंड इंतज़ार करें.
- वीडियो चलाना शुरू करें
सिर्फ़ आसान तरीके से स्विच करने के लिए इस्तेमाल होने वाला स्यूडो-कोड इस तरह से है:
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();
}