रीफ़्रेश रेट की अलग-अलग सेटिंग

Android 11 में, एक से ज़्यादा रिफ़्रेश रेट वाले डिवाइसों के लिए भी काम करने की सुविधा जोड़ी गई है. इस सुविधा के तीन मुख्य कॉम्पोनेंट हैं:

  • नए HAL API यहां दिए गए: android.hardware.graphics.composer@2.4.
  • अलग-अलग रीफ़्रेश दरों और डिवाइस के कॉन्फ़िगरेशन को पार्स करने के लिए प्लैटफ़ॉर्म कोड अपने हिसाब से रीफ़्रेश दर सेट करें
  • नए SDK टूल और एनडीके एपीआई की मदद से, ऐप्लिकेशन अपनी पसंद का फ़्रेम रेट सेट कर सकते हैं

लागू करना

android.hardware.graphics.composer@2.4 HAL में, रीफ़्रेश रेट स्विच करने के लिए खास सहायता जोड़ी गई है. हमारा सुझाव है कि आप इस वर्शन का इस्तेमाल करें, क्योंकि composer HAL के पुराने वर्शन में रीफ़्रेश रेट स्विच करने की सुविधा सीमित तौर पर काम करती है.

कॉन्फ़िगरेशन ग्रुप

इसमें एक नया एट्रिब्यूट CONFIG_GROUP जोड़ा गया IComposerClient::Attribute जिसे getDisplayAttribute_2_4 एपीआई. इस एट्रिब्यूट की मदद से, वेंडर डिसप्ले कॉन्फ़िगरेशन को एक साथ ग्रुप कर सकते हैं. एक ही ग्रुप के कॉन्फ़िगरेशन की मदद से जिनमें ज़्यादातर मामलों में उनके बीच आसानी से स्विच किया जा सकता है. कॉन्फ़िगरेशन ग्रुप का इस्तेमाल किया गया प्लैटफ़ॉर्म की मदद से, यह पता लगाया जा सकता है कि कौनसे कॉन्फ़िगरेशन के बीच स्विच किया जा सकता है ताकि रीफ़्रेश दर पर स्विच किया जा सके, न कि दूसरे एट्रिब्यूट में कॉन्फ़िगरेशन.

यहां दिए गए उदाहरण में, चार डिसप्ले कॉन्फ़िगरेशन के साथ कॉन्फ़िगर ग्रुप इस्तेमाल करने के फ़ायदों के बारे में बताया गया है:

  • 1080 पिक्सल@60 हर्ट्ज़
  • 1080 पिक्सल@90 हर्ट्ज़
  • 1080i@72Hz
  • 1080i@48Hz

भले ही डिवाइस 48 हर्ट्ज़, 60 हर्ट्ज़, 72 हर्ट्ज़, और 90 हर्ट्ज़ की रीफ़्रेश दर के साथ काम करता है डिसप्ले अलग मोड पर काम करता है. इसलिए, डिसप्ले को 60 हर्ट्ज़ से 72 हर्ट्ज़ पर स्विच करने पर, 1080p से 1080i तक का डिसप्ले कॉन्फ़िगरेशन होना चाहिए, जो आपकी पसंद के मुताबिक न हो. कॉन्फ़िगरेशन ग्रुप का इस्तेमाल करके, इस समस्या को हल किया जाता है. 60 हर्ट्ज़ और 90 हर्ट्ज़ को एक साथ ग्रुप करके कॉन्फ़िगरेशन ग्रुप और किसी दूसरे कॉन्फ़िगरेशन ग्रुप में 48 हर्ट्ज़ और 72 हर्ट्ज़ की वैल्यू शामिल करें. प्लैटफ़ॉर्म को पता है कि वह 60Hz और 90Hz के बीच और 48Hz और 72Hz के बीच स्विच कर सकता है, लेकिन 60Hz और 72Hz के बीच नहीं. ऐसा इसलिए, क्योंकि इससे रीफ़्रेश रेट में बदलाव होने के बजाय, कॉन्फ़िगरेशन में बदलाव होगा.

Composer API के अपडेट

getDisplayVsyncPeriod
रीफ़्रेश दरें बदलते समय बेहतर नियंत्रण और अनुमान लगाने की क्षमता के लिए getDisplayVsyncPeriod जोड़ दिया गया है. getDisplayVsyncPeriod मौजूदा रीफ़्रेश दर दिखाता है (इनके हिसाब से vsync अवधि) तक ट्रैक किया जा सकता है. यह खास तौर पर तब मददगार होता है, रीफ़्रेश दर और मौजूदा रीफ़्रेश दर के बीच ट्रांज़िशन करने के लिए, इसकी मदद से, यह तय किया जा सकता है कि अगला फ़्रेम कब शुरू करना है.
setActiveConfigWithConstraints
setActiveConfigWithConstraints तरीका एक नया एक्सटेंशन है मौजूदा setActiveConfig तरीके से कॉन्फ़िगरेशन में हुए बदलाव के बारे में जानकारी. ये पाबंदियां, vsyncPeriodChangeConstraints पैरामीटर के हिस्से के तौर पर दी जाती हैं. इनमें ये पैरामीटर शामिल होते हैं.
    मनचाहा समय
    CLOCK_MONOTONIC में वह समय जिसके बाद vsync अवधि बदल सकती है (इसका मतलब है कि vsync अवधि इस समय से पहले नहीं बदलनी चाहिए). यह तब काम आता है, जब प्लैटफ़ॉर्म को रीफ़्रेश रेट में बदलाव करने के लिए पहले से योजना बनानी हो, लेकिन उसके पास दिखाने के लिए पहले से ही कुछ बफ़र मौजूद हों. प्लैटफ़ॉर्म इस समय को उन बफ़र के हिसाब से सेट करता है और पक्का करता है कि रीफ़्रेश दर में जितना हो सके उतना आसान बदलाव करना होगा.
    बिना रुकावट के ज़रूरी है
    अगर सही है, तो यह ज़रूरी है कि vsync अवधि में बदलाव बिना किसी रुकावट के किया जाना चाहिए बिना किसी विज़ुअल आर्टफ़ैक्ट के. प्लैटफ़ॉर्म इस फ़्लैग का इस्तेमाल तब करता है, जब कॉन्टेंट में बदलाव होने की वजह से, रिफ़्रेश रेट में बदलाव करना ज़रूरी हो. उदाहरण के लिए, डिवाइस के आइडल होने और ऐनिमेशन शुरू होने पर. इससे वेंडर को कुछ कॉन्फ़िगरेशन में बदलाव करने की अनुमति नहीं मिलती, क्योंकि इससे विज़ुअल में गड़बड़ी हो सकती है. अगर कॉन्फ़िगरेशन को बिना किसी रुकावट के बदला नहीं जा सकता और seamlessRequired को true पर सेट किया गया है, लागू करने पर यह उम्मीद की जाती है कि वापसी कोड के रूप में SEAMLESS_NOT_POSSIBLE लौटेगा और समान कॉन्फ़िगरेशन होने पर नए onSeamlessPossible कॉलबैक को कॉल करें बदलाव आसानी से किया जा सकता है.

लागू होने के बाद, VsyncPeriodChangeTimeline दिखता है. इससे प्लैटफ़ॉर्म को पता चलता है कि रीफ़्रेश रेट में कब बदलाव होगा. newVsyncAppliedTimeNanos पैरामीटर को CLOCK_MONOTONIC में उस समय पर सेट करना होगा जब नया डिसप्ले, नए vsync पीरियड पर रीफ़्रेश होना शुरू होगा. इससे, वे एक साथ desiredTimeNanos की मदद से, प्लैटफ़ॉर्म पहले से ही रीफ़्रेश कर देता है रेट स्विच करें और नई रीफ़्रेश दर के लिए ऐप्लिकेशन पर पहले से ही टिक करना शुरू करें. इससे, रीफ़्रेश रेट में बिना किसी रुकावट के बदलाव किया जा सकता है.

कुछ तरीकों को लागू करने के लिए, रीफ़्रेश रेट भेजने से पहले रीफ़्रेश फ़्रेम भेजना ज़रूरी होता है. इसके लिए, एचएएल में refreshRequired पैरामीटर होता है, जिससे यह पता चलता है कि रीफ़्रेश फ़्रेम की ज़रूरत है. साथ ही, refreshTimeNanos से यह पता चलता है कि रीफ़्रेश फ़्रेम को किस पहले vsync के बाद भेजना है.

onVsyncPeriodTimingChanged [कॉलबैक]
एक नया कॉलबैक, जिसे एचएएल कॉल करके यह बता सकता है कि कुछ में टाइमलाइन का पैरामीटर बदल गया है और प्लैटफ़ॉर्म को अपनी टाइमलाइन में बदलाव करने की ज़रूरत है. अगर किसी वजह से, एचएएल पर प्रोसेसिंग में ज़्यादा समय लगने या रिफ़्रेश फ़्रेम में देरी होने की वजह से, पुरानी टाइमलाइन को मिटाने का समय नहीं मिलता है, तो इस कॉलबैक को कॉल किया जाएगा.

प्लैटफ़ॉर्म, रीफ़्रेश दर में बदलाव कैसे करता है?

रीफ़्रेश दर को सिस्टम की इन दो सेवाओं में चुना जाता है:

प्रदर्शन मैनेजर
DisplayManager, रीफ़्रेश रेट के लिए सबसे ऊपर की नीति सेट करता है. यह एक डिफ़ॉल्ट डिसप्ले कॉन्फ़िगरेशन सेट करता है, जो कंपोज़र HAL कॉन्फ़िगरेशन. इसके अलावा, यह कम से कम और ज़्यादा से ज़्यादा रेंज की रेंज सेट करता है रीफ़्रेश के तौर पर चुनने के लिए SurfaceFlinger की वैल्यू दर.
सरफ़ेसफ्लिंगर
डिफ़ॉल्ट कॉन्फ़िगरेशन के कॉन्फ़िगरेशन ग्रुप में मौजूद कॉन्फ़िगरेशन सेट करके, रीफ़्रेश रेट तय करता है. साथ ही, रीफ़्रेश रेट को कम से कम/ज़्यादा से ज़्यादा रेंज में रखता है.

नीति तय करने के लिए, Display Manager इन चरणों को पूरा करता है:

  • SurfaceFlinger से चालू कॉन्फ़िगरेशन के बारे में क्वेरी करके, डिफ़ॉल्ट कॉन्फ़िगरेशन आईडी ढूंढता है
  • सिस्टम की स्थितियों पर बार-बार जाकर, कम से कम और ज़्यादा से ज़्यादा वैल्यू की रेंज पर पाबंदी लगाना
    • रीफ़्रेश रेट की डिफ़ॉल्ट सेटिंग: रीफ़्रेश रेट की डिफ़ॉल्ट वैल्यू, R.integer.config_defaultRefreshRate कॉन्फ़िगरेशन ओवरले में सेट होती है. इस वैल्यू का इस्तेमाल, ऐनिमेशन और टच इंटरैक्शन के लिए डिवाइस के स्टैंडर्ड रीफ़्रेश रेट का पता लगाने के लिए किया जाता है.
    • ज़्यादा से ज़्यादा रीफ़्रेश रेट की सेटिंग: ज़्यादा से ज़्यादा रीफ़्रेश रेट की वैल्यू, Settings.System.PEAK_REFRESH_RATE से पढ़ी जाती है. डिवाइस की मौजूदा सेटिंग (जैसे, मेन्यू विकल्प से) को दिखाने के लिए, इस वैल्यू को रनटाइम में बदला जाता है. डिफ़ॉल्ट वैल्यू, इसमें है R.integer.config_defaultPeakRefreshRate कॉन्फ़िगरेशन ओवरले.
    • रीफ़्रेश रेट की कम से कम वैल्यू सेट करने की सुविधा: रीफ़्रेश रेट की कम से कम वैल्यू, Settings.System.MIN_REFRESH_RATE से पढ़ी जाती है. यह मान ये काम कर सकता है: डिवाइस की मौजूदा सेटिंग (जैसे, किसी मेन्यू से) दिखाने के लिए रनटाइम में बदला जा सकता है विकल्प). इसकी डिफ़ॉल्ट वैल्यू 0 है. इसलिए, कोई डिफ़ॉल्ट कम से कम वैल्यू नहीं है.
    • ऐप्लिकेशन का अनुरोध किया गया ModeId: ऐप्लिकेशन सेट कर सकते हैं WindowManager.LayoutParams.preferredDisplayModeId ताकि डिसप्ले को मैनेज करने के लिए एक पसंदीदा कॉन्फ़िगरेशन दिखाया जा सके. ज़्यादातर स्थितियों में DisplayManager, डिफ़ॉल्ट कॉन्फ़िगरेशन आईडी सेट करता है साथ ही, रीफ़्रेश दर की कम से कम और ज़्यादा से ज़्यादा रीफ़्रेश दर को कॉन्फ़िगरेशन की रीफ़्रेश दर.
    • बैटरी सेवर: रीफ़्रेश दर 60 हर्ट्ज़ तक या सीमित है कम पावर मोड में होने पर कम होता है, जो इसके ज़रिए दिखाया जाता है Settings.Global.LOW_POWER_MODE.

DisplayManager नीति सेट करने के बाद, SurfaceFlinger ऐक्टिव लेयर (लेयर जो फ़्रेम अपडेट को कतार में डालती हैं) के आधार पर रीफ़्रेश रेट सेट करता है. अगर लेयर का मालिक फ़्रेम रेट सेट करता है, तो SurfaceFlinger रीफ़्रेश दर को किसी ऐसी चीज़ पर सेट करने की कोशिश करता है जो उस दर का गुणक होती है. उदाहरण के लिए, अगर दो चालू लेयर अपना फ़्रेम रेट 24 और 60 पर सेट करती हैं, तो SurfaceFlinger उपलब्ध होने पर, इसे 120 हर्ट्ज़ पर सेट किया जा सकता है. अगर रीफ़्रेश दर इनके लिए उपलब्ध नहीं होती है SurfaceFlinger में है, तो यह रीफ़्रेश दर चुनने की कोशिश करेगा फ़्रेम रेट में गड़बड़ी आ रही है. ज़्यादा जानकारी के लिए, developer.android.com पर डेवलपर दस्तावेज़ देखें

SurfaceFlinger इन फ़्लैग को बनाए रखता है रीफ़्रेश दर तय करने का तरीका कंट्रोल करें:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: अगर रिफ़्रेश रेट सेट किया गया है, तो यह ऐक्टिव लेयर के आधार पर तय किया जाता है. भले ही, फ़्रेम रेट सेट न किया गया हो. SurfaceFlinger कंपनी अनुभव के आधार पर, जहां इसे पता चलता है कि लेयर औसत एफ़पीएस (फ़्रेम प्रति सेकंड) के हिसाब से बफ़र कर रही है बफ़र से अटैच किए गए प्रज़ेंटेशन टाइमस्टैंप को देखकर.
  • ro.surface_flinger.set_touch_timer_ms: अगर > 0, डिफ़ॉल्ट कॉन्फ़िगर की गई सेटिंग के लिए उपयोगकर्ता के स्क्रीन को छूने पर रीफ़्रेश दर का इस्तेमाल किया जाएगा टाइम आउट हो गया. यह अनुमान डिफ़ॉल्ट रीफ़्रेश दर के साथ तैयार किया जाता है ऐनिमेशन.
  • ro.surface_flinger.set_idle_timer_ms: अगर > 0, कम से कम रीफ़्रेश दर का इस्तेमाल तब किया जाएगा, जब कॉन्फ़िगर किए गए टाइम आउट के लिए कोई स्क्रीन अपडेट नहीं होगा.
  • ro.surface_flinger.set_display_power_timer_ms: अगर > 0, यह डिसप्ले चालू करते समय (या डिसप्ले चालू करते समय) एओडी से बाहर हो जाता है).

फ़्रेम रेट एपीआई

फ़्रेम रेट एपीआई की मदद से, ऐप्लिकेशन Android प्लैटफ़ॉर्म को अपने फ़्रेम रेट के बारे में बता सकते हैं. यह एपीआई, Android 11 को टारगेट करने वाले ऐप्लिकेशन के लिए उपलब्ध है. फ़्रेम रेट एपीआई के बारे में ज़्यादा जानने के लिए, developer.android.com पर डेवलपर दस्तावेज़ देखें.

डेवलपर के लिए सेटिंग और टूल

मेन्यू में डेवलपर के लिए एक नया विकल्प जोड़ा गया है. यह ओवरले को टॉगल करके चालू करता है मौजूदा रीफ़्रेश दर वाला डिसप्ले. नया विकल्प, सेटिंग > सिस्टम > डेवलपर के लिए सेटिंग और टूल > रिफ़्रेश रेट दिखाएं में मौजूद है.