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

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

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

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

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

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

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

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

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

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

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

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

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

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

बजट के बंटवारे में किसी भी तरह की रुकावट से बचने के लिए, यह तरीका अपनाएं:

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

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

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

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

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

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