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

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

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

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

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

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

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

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

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

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

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

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

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

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

ऐलोकेशन में होने वाली गड़बड़ियों से बचने के लिए, ये सुझाव अपनाएं:

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

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

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

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

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

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