एकाधिक ताज़ा दर

एंड्रॉइड 11 एकाधिक ताज़ा दरों वाले उपकरणों के लिए समर्थन जोड़ता है। इस सुविधा के तीन मुख्य घटक हैं:

  • android.hardware.graphics.composer@2.4 में नए HAL API पेश किए गए।
  • विभिन्न ताज़ा दरों के लिए डिवाइस कॉन्फ़िगरेशन को पार्स करने और वांछित ताज़ा दर निर्धारित करने के लिए प्लेटफ़ॉर्म कोड
  • नए एसडीके और एनडीके एपीआई ऐप्स को उनकी वांछित फ्रेम दर सेट करने की अनुमति देते हैं

कार्यान्वयन

ताज़ा दर स्विचिंग के लिए समर्पित समर्थन android.hardware.graphics.composer@2.4 HAL में जोड़ा गया है। हम दृढ़ता से इस संस्करण का उपयोग करने की अनुशंसा करते हैं क्योंकि कंपोजर एचएएल के पिछले संस्करणों में ताज़ा दर स्विचिंग के लिए सीमित समर्थन है।

कॉन्फ़िग समूह

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

निम्नलिखित उदाहरण पर विचार करें जो चार डिस्प्ले कॉन्फ़िगरेशन का समर्थन करने वाले डिवाइस के साथ कॉन्फ़िगरेशन समूहों का उपयोग करने के लाभों को प्रदर्शित करता है:

  • 1080p@60Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

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

संगीतकार एपीआई अद्यतन

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 को इंगित करने के लिए है जहां एक रिफ्रेश फ्रेम को बाद में भेजने की आवश्यकता है।

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

प्लेटफ़ॉर्म ताज़ा दर को बदलने का निर्णय कैसे लेता है?

ताज़ा दर चयन निम्नलिखित दो सिस्टम सेवाओं में होता है:

प्रदर्शन प्रबंधक
DisplayManager ताज़ा दर के आसपास उच्च स्तरीय नीति निर्धारित करता है। यह एक डिफ़ॉल्ट डिस्प्ले कॉन्फिगरेशन सेट करता है, जो कंपोजर एचएएल कॉन्फिगरेशन के समान है। इसके अतिरिक्त, यह SurfaceFlinger ताज़ा दर के रूप में चुनने के लिए न्यूनतम और अधिकतम मानों की एक सीमा निर्धारित करता है।
सरफेसफ्लिंगर
एक कॉन्फ़िगरेशन सेट करके ताज़ा दर निर्धारित करता है जो डिफ़ॉल्ट कॉन्फ़िगरेशन के समान कॉन्फ़िगरेशन समूह में है और न्यूनतम/अधिकतम सीमा के भीतर ताज़ा दर के साथ है।

नीति निर्धारित करने के लिए प्रदर्शन प्रबंधक निम्नलिखित चरणों से चलता है:

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

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

ताज़ा दर कैसे तय की जाती है इसे नियंत्रित करने के लिए SurfaceFlinger निम्नलिखित झंडे बनाए रखता है:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: यदि सेट किया गया है तो ताज़ा दर सक्रिय परतों के आधार पर तय की जाती है, भले ही फ़्रेम दर सेट न की गई हो। सरफेसफ्लिंगर एक अनुमान रखता है जहां यह बफर से जुड़े प्रेजेंटेशन टाइमस्टैम्प को देखकर औसत एफपीएस पाता है जो परत बफर पोस्ट कर रही है।
  • 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 है, तो कॉन्फ़िगर किए गए टाइमआउट के लिए डिस्प्ले चालू करते समय (या AOD से बाहर जाते समय) डिफ़ॉल्ट ताज़ा दर का उपयोग किया जाएगा।

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

फ्रेम दर एपीआई ऐप्स को उनके इच्छित फ्रेम दर के बारे में एंड्रॉइड प्लेटफॉर्म को सूचित करने देता है और यह उन ऐप्स पर उपलब्ध है जो एंड्रॉइड 11 को लक्षित करते हैं। फ्रेम दर एपीआई के बारे में अधिक जानने के लिए, डेवलपर.एंड्रॉइड.कॉम ​​पर डेवलपर दस्तावेज़ देखें।

डेवलपर विकल्प

मेनू में एक नया डेवलपर विकल्प जोड़ा गया है जो वर्तमान ताज़ा दर के साथ डिस्प्ले पर एक ओवरले को टॉगल करता है। नया विकल्प सेटिंग्स > सिस्टम > डेवलपर विकल्प > ताज़ा दर दिखाएँ के अंतर्गत है।