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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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