क्लाइंट फ़्रेमबफ़र मैनेजमेंट

Android 13 से, डिसप्ले रिज़ॉल्यूशन में बदलाव होने पर, क्लाइंट कंपोज़िशन के दौरान इस्तेमाल किए गए नए फ़्रेमबफ़र असाइन किए जाते हैं. रिज़ॉल्यूशन में बदलाव होने के बाद, SurfaceFlinger अगले अमान्य करें साइकल में यह बंटवारा करता है.

रिज़ॉल्यूशन स्विच करते समय फ़्रेमबफ़र मैनेजमेंट

इन दो स्थितियों में से किसी एक की वजह से रिज़ॉल्यूशन में बदलाव होता है:

  • हॉटप्लग इवेंट, जिसे हार्डवेयर कंपोज़र (एचडब्ल्यूसी) शुरू करता है. यह तब होता है, जब एक बाहरी डिसप्ले से किसी दूसरे बाहरी डिसप्ले पर स्विच किया जाता है. इस दूसरे डिसप्ले का डिफ़ॉल्ट रिज़ॉल्यूशन अलग होता है.

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

  • यह डिसप्ले मोड स्विच, SurfaceFlinger शुरू करता है. ऐसा तब होता है, जब उपयोगकर्ता उपयोगकर्ता सेटिंग में जाकर रिज़ॉल्यूशन बदलता है या कोई ऐप्लिकेशन preferredDisplayModeId की मदद से रिज़ॉल्यूशन बदलता है.

    डिसप्ले मोड स्विच करने के दौरान, SurfaceFlinger, setActiveConfig या setActiveConfigWithConstraints को कॉल करने से पहले, मौजूदा क्लाइंट फ़्रेमबफ़र के हैंडल रिलीज़ करता है.

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

  • हॉटप्लग इवेंट के लिए, onHotplug को कॉल करने से ठीक पहले.

  • मोड स्विच करने के लिए, setActiveConfig या setActiveConfigWithConstraints को कॉल करने के तुरंत बाद.

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

फ़्रेमबफ़र को मैनेज करने के लिए सुझाव

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

मेमोरी के असाइनमेंट से जुड़ी गंभीर समस्याओं से बचने के लिए, इन सुझावों का पालन करें:

  • अगर HWC को नए क्लाइंट फ़्रेमबफ़र उपलब्ध होने तक, पुराने क्लाइंट फ़्रेमबफ़र का इस्तेमाल जारी रखना है, तो पुराने और नए, दोनों फ़्रेमबफ़र के लिए मेमोरी रिज़र्व करना ज़रूरी है. साथ ही, फ़्रेमबफ़र मेमोरी स्पेस पर डिफ़्रैगमेंटेशन एल्गोरिदम भी चलाए जा सकते हैं.

  • फ़्रेमबफ़र के लिए, एक अलग मेमोरी पूल असाइन करें. यह ग्राफ़िक बफ़र मेमोरी के बाकी हिस्से से अलग होना चाहिए. यह इसलिए ज़रूरी है, क्योंकि फ़्रेमबफ़र को डी-अलॉकेट करने और फिर से अलॉकेट करने के बीच, तीसरे पक्ष की प्रोसेस ग्राफ़िक्स मेमोरी को अलॉकेट करने की कोशिश कर सकती है. अगर फ़्रेमबफ़र और तीसरे पक्ष की प्रोसेस, दोनों एक ही ग्राफ़िक्स मेमोरी पूल का इस्तेमाल करती हैं और ग्राफ़िक्स मेमोरी पूरी तरह से भर जाती है, तो तीसरे पक्ष की प्रोसेस, फ़्रेमबफ़र के लिए पहले से तय की गई ग्राफ़िक्स मेमोरी का इस्तेमाल कर सकती है. इससे फ़्रेमबफ़र के लिए मेमोरी कम हो जाती है या मेमोरी स्पेस फ़्रैगमेंट हो जाता है.

फ़्रेमबफ़र मैनेजमेंट की जांच करना

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

  • हॉटप्लग इवेंट के लिए, अलग-अलग रिज़ॉल्यूशन वाले दो डिसप्ले को अनप्लग करें और फिर से कनेक्ट करें.

  • मोड स्विच करने के लिए, ModeSwitchingTestActivity CTS Verifier टेस्ट का इस्तेमाल करें. इससे फ़्रेमबफ़र मेमोरी के व्यवहार की जांच के लिए, मोड स्विच किया जा सकेगा. इस टेस्ट से, ऐसी समस्याओं का पता लगाया जा सकता है जिन्हें प्रोग्राम के ज़रिए ढूंढना मुश्किल होता है.