ग्राफ़िक्स मेमोरी खपत कम करें

ग्राफ़िक्स स्टैक में, आईपीसी पर फ़ाइल डिस्क्रिप्टर भेजने से जुड़े ओवरहेड को कम करने के लिए कंपोज़र एचएएल और सर्फेसफ्लिंगर के बीच एक प्रति-परत बफर कैश बैठता है। Android 14 से पहले, इस बफ़र कैश को तब शुद्ध नहीं किया जाता था जब एक GraphicBufferProducer एक SurfaceFlinger GraphicBufferConsumer से डिस्कनेक्ट हो जाता है, जैसे कि जब एक MediaCodec एक SurfaceView से डिस्कनेक्ट हो जाता है। एंड्रॉइड 14 से शुरू करके, आप ग्राफ़िक्स मेमोरी खपत को कम करने के लिए इस बफ़र कैश को जबरदस्ती शुद्ध कर सकते हैं।

निम्नलिखित दो विकल्पों में से एक चुनें:

  • Android 14 और उच्चतर के साथ लॉन्च होने वाले उपकरणों के लिए, आपको नया कंपोज़र HAL API संस्करण 3.2 लागू करना होगा। यह विकल्प डिफ़ॉल्ट रूप से सक्रिय होता है और सबसे अधिक मेमोरी बचाता है। 14 और बाद में अपग्रेड करने वाले डिवाइस भी पूर्ण मेमोरी लाभ प्राप्त करने के लिए इस विकल्प का उपयोग कर सकते हैं।
  • एंड्रॉइड 14 में अपग्रेड करने वाले उपकरणों के लिए जिनके लिए आप कंपोजर एचएएल 3.2 एपीआई लागू नहीं करना चाहते हैं, आप बैकवर्ड-संगत विकल्प को सक्षम कर सकते हैं। यह विकल्प पिछले विकल्प की तरह ही लगभग उतनी ही मेमोरी बचाता है।

निम्नलिखित दो अनुभाग बताते हैं कि प्रत्येक विकल्प को कैसे लागू किया जाए।

कंपोज़र एचएएल 3.2 एपीआई लागू करें

पूर्ण ग्राफ़िक्स बफ़र मेमोरी लाभ प्राप्त करने के लिए, आपको यह करना होगा:

  1. अपने कंपोज़र एचएएल कार्यान्वयन को संस्करण 3.2 में अद्यतन करें।
  2. सूची में पाए गए स्लॉट नंबरों द्वारा इंगित बफर कैश प्रविष्टियों को शुद्ध करके LayerCommand::bufferSlotsToClear की प्रक्रिया करें।

LayerCommand:bufferSlotsToClear सहित ग्राफ़िक बफ़र मेमोरी से संबंधित कंपोज़र HAL 3.2 API, LayerCommand.aidl- में हैं।

पश्चगामी-संगत विकल्प सक्षम करें

बैकवर्ड-संगत मेमोरी रिडक्शन विकल्प कैश स्लॉट में एक वास्तविक बफर को 1x1 प्लेसहोल्डर बफर से बदल देता है, जिसके परिणामस्वरूप वर्तमान सक्रिय बफर स्लॉट को छोड़कर सभी शुद्ध स्लॉट के लिए मेमोरी बचत होती है। आंशिक मेमोरी बचत लाभ प्राप्त करने के लिए, surface_flinger.clear_slots_with_set_layer_buffer sysprop को true पर सेट करके बैकवर्ड-संगत विकल्प को सक्षम करें। यह sysprop property_contexts फ़ाइल में पाया जाता है।

इस sysprop को सेट करने के लिए आपके कंपोज़र HAL कार्यान्वयन को एक ही वर्तमान चक्र में एक ही परत के लिए कई setLayerBuffer कमांड को सही ढंग से संभालने की आवश्यकता होती है।

बैकवर्ड-संगत विकल्प को सक्षम करने से निम्नलिखित प्रभाव पड़ते हैं:

  • एआईडीएल एचएएल के लिए: सरफेसफ्लिंगर एक परत के लिए कई LayerCommand इंस्टेंस भेजता है, प्रत्येक एक BufferCommand के साथ। प्रत्येक BufferCommand में 1x1 प्लेसहोल्डर बफ़र हैंडल और कैश बफ़र स्लॉट के लिए एक स्लॉट नंबर होता है जिसे शुद्ध करने की आवश्यकता होती है।

  • HIDL HALs के लिए: SurfaceFlinger कई SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER कमांड भेजता है। इन कमांड में 1x1 प्लेसहोल्डर बफ़र हैंडल और कैश बफ़र स्लॉट के लिए एक स्लॉट नंबर होता है जिसे शुद्ध करने की आवश्यकता होती है।

बैकवर्ड-संगत विकल्प के कारण कुछ डिवाइस पर कंपोज़र HAL क्रैश हो सकता है। आप इस समस्या को हल करने के लिए अपने कंपोज़र HAL को संशोधित करने में सक्षम हो सकते हैं। इस व्यवहार को नियंत्रित करने वाला कोड यहां पाया गया है:

ग्राफ़िक्स बफ़र कैश मेमोरी खपत का परीक्षण करें

परीक्षण यह सत्यापित नहीं कर सकते कि कैश स्लॉट एचएएल कार्यान्वयन द्वारा शुद्ध किए गए हैं या नहीं। हालाँकि, आप ग्राफ़िक बफ़र उपयोग की निगरानी के लिए अपने डिबगिंग टूल का उपयोग कर सकते हैं। जैसे ही आप निगरानी करते हैं, आपको ध्यान देना चाहिए कि उन परिदृश्यों में कम मेमोरी त्रुटियां होती हैं जहां कई अलग-अलग वीडियो बंद हो जाते हैं और यूट्यूब पर त्वरित उत्तराधिकार में शुरू होते हैं।

वीटीएस परीक्षण उपलब्ध हैं जो सत्यापित करते हैं कि एचएएल कार्यान्वयन कार्यात्मक रूप से नए एपीआई कॉल (एचएएल संस्करण 3.2+) या पिछड़े-संगत कार्यान्वयन के लिए कई setLayerBuffer कमांड प्राप्त करने में सक्षम है। हालाँकि, इसे उचित कार्यक्षमता के लिए पर्याप्त परीक्षण नहीं माना जाना चाहिए, क्योंकि कुछ डिवाइस इन वीटीएस परीक्षणों को पास कर लेते हैं, लेकिन वास्तविक दुनिया के उपयोग के मामलों में विफल हो जाते हैं।

नए वीटीएस परीक्षणों के लिए, निम्नलिखित लिंक पर जाएँ: