Android 13 से, डिसप्ले रिज़ॉल्यूशन में बदलाव होने पर, सिस्टम नए फ़्रेमबफ़र असाइन करता है. इनका इस्तेमाल क्लाइंट कंपोज़िशन के दौरान किया जाता है. रिज़ॉल्यूशन में बदलाव होने के बाद, SurfaceFlinger इस असाइनमेंट को अगली अमान्य करें साइकल पर करता है.
रिज़ॉल्यूशन स्विच करते समय फ़्रेमबफ़र मैनेजमेंट
रिज़ॉल्यूशन में बदलाव, इन दो स्थितियों में से किसी एक की वजह से होता है:
यह हॉटप्लग इवेंट, हार्डवेयर कंपोज़र (एचडब्ल्यूसी) शुरू करता है. यह तब होता है, जब किसी बाहरी डिसप्ले को किसी ऐसे दूसरे बाहरी डिसप्ले से स्वैप किया जाता है जिसका डिफ़ॉल्ट रिज़ॉल्यूशन अलग होता है.
हॉटप्लग इवेंट के दौरान, HWC पुराने डिसप्ले डेटा को हटाने पर, पुराने फ़्रेमबफ़र के हैंडल रिलीज़ करता है.
यह डिसप्ले मोड स्विच, SurfaceFlinger शुरू करता है. यह तब होता है, जब उपयोगकर्ता की सेटिंग का इस्तेमाल करके रिज़ॉल्यूशन बदला जाता है या कोई ऐप्लिकेशन
preferredDisplayModeId
का इस्तेमाल करके रिज़ॉल्यूशन बदलता है.डिसप्ले मोड स्विच करने के दौरान, SurfaceFlinger,
setActiveConfig
याsetActiveConfigWithConstraints
को कॉल करने से पहले, मौजूदा क्लाइंट फ़्रेमबफ़र के हैंडल रिलीज़ करता है.
जिन डिवाइसों में फ़्रेमबफ़र मेमोरी कम होती है उनमें मेमोरी फ़्रैगमेंटेशन जैसी गंभीर समस्याओं को रोकने के लिए, HWC को पुराने फ़्रेमबफ़र के हैंडल रिलीज़ करने होंगे. इन मामलों में यह ज़रूरी है:
हॉटप्लग इवेंट के लिए,
onHotplug
को कॉल करने से ठीक पहले.मोड बदलने के लिए,
setActiveConfig
याsetActiveConfigWithConstraints
पर कॉल करने के तुरंत बाद.
हैंडल रिलीज़ करने से, फ़्रेमबफ़र मेमोरी पूरी तरह से डीऐलोकेट हो जाती है. इससे SurfaceFlinger को अगले अमान्य करें साइकल के दौरान, नए फ़्रेमबफ़र ऐलोकेट करने में मदद मिलती है.
फ़्रेमबफ़र मैनेजमेंट के लिए सुझाव
अगर एचडब्ल्यूसी, पुराने फ़्रेमबफ़र को समय पर हैंडल नहीं करता है, तो पुराने फ़्रेमबफ़र को डी-अलॉकेट करने से पहले ही, नए फ़्रेमबफ़र को अलॉकेट कर दिया जाता है. इस वजह से, फ़्रैगमेंटेशन या अन्य समस्याओं की वजह से नया असाइनमेंट पूरा न होने पर, गंभीर समस्याएं हो सकती हैं. इससे भी बुरी बात यह है कि अगर HWC इन हैंडल को रिलीज़ नहीं करता है, तो मेमोरी लीक हो सकती है.
मेमोरी के असाइनमेंट से जुड़ी गंभीर समस्याओं से बचने के लिए, इन सुझावों का पालन करें:
अगर HWC को नए क्लाइंट फ़्रेमबफ़र उपलब्ध होने तक, पुराने क्लाइंट फ़्रेमबफ़र का इस्तेमाल जारी रखना है, तो पुराने और नए, दोनों फ़्रेमबफ़र के लिए मेमोरी रिज़र्व करना ज़रूरी है. साथ ही, फ़्रेमबफ़र मेमोरी स्पेस पर डिफ़्रैगमेंटेशन एल्गोरिदम चलाने की ज़रूरत पड़ सकती है.
फ़्रेमबफ़र के लिए, एक अलग मेमोरी पूल असाइन करें. यह ग्राफ़िक बफ़र मेमोरी के बाकी हिस्से से अलग होना चाहिए. यह इसलिए ज़रूरी है, क्योंकि कोई थर्ड पार्टी प्रोसेस, फ़्रेमबफ़र को डी-एलॉकेट और री-एलॉकेट करने के बीच ग्राफ़िक्स मेमोरी को एलॉकेट करने की कोशिश कर सकती है. अगर फ़्रेमबफ़र, ग्राफ़िक्स मेमोरी के एक ही पूल का इस्तेमाल करता है और ग्राफ़िक्स मेमोरी पूरी तरह से भर जाती है, तो तीसरे पक्ष की प्रोसेस, फ़्रेमबफ़र के लिए पहले से असाइन की गई मेमोरी का इस्तेमाल कर सकती है. इससे फ़्रेमबफ़र को फिर से असाइन करने या मेमोरी फ़्रैगमेंटेशन के लिए, ज़रूरत के मुताबिक मेमोरी नहीं मिल पाती.
फ़्रेमबफ़र मैनेजमेंट की जांच करना
ओईएम को सलाह दी जाती है कि वे अपने डिवाइस के लिए, रिज़ॉल्यूशन स्विच करने पर क्लाइंट फ़्रेमबफ़र मेमोरी को सही तरीके से मैनेज करने की सुविधा की जांच करें. इसके बारे में यहां बताया गया है:
हॉटप्लग इवेंट के लिए, अलग-अलग रिज़ॉल्यूशन वाले दो डिसप्ले को अनप्लग करें और फिर से कनेक्ट करें.
मोड स्विच करने के लिए,
ModeSwitchingTestActivity
CTS Verifier टेस्ट का इस्तेमाल करें. इससे फ़्रेमबफ़र मेमोरी के व्यवहार की जांच के लिए, मोड स्विच किया जा सकेगा. इस टेस्ट से, ऐसी समस्याओं का पता लगाया जा सकता है जिन्हें प्रोग्राम के ज़रिए ढूंढना मुश्किल होता है.