मेमोरी मैनेज करने के बारे में जानकारी

Android पर, गेमिंग का बेहतर और स्थिर अनुभव देने के लिए, मेमोरी को ऑप्टिमाइज़ करना ज़रूरी है. इस गाइड में, मेमोरी की बचत करने की अहमियत के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि Android ऑपरेटिंग सिस्टम, प्रोसेस की मेमोरी की सीमाओं को कैसे मैनेज करता है. इसके अलावा, Google Play Console में मेमोरी की नई मेट्रिक के बारे में भी बताया गया है. इससे आपको अपने गेम की तकनीकी क्वालिटी को मॉनिटर करने और उसे बेहतर बनाने में मदद मिलेगी.

मेमोरी को ऑप्टिमाइज़ करने की अहमियत

खिलाड़ियों को अपने गेम से जोड़े रखने, डिवाइसों के साथ कंपैटिबिलिटी बढ़ाने, और प्लैटफ़ॉर्म के क्वालिटी स्टैंडर्ड के मुताबिक काम करने के लिए, अपने गेम की मेमोरी को ऑप्टिमाइज़ करना ज़रूरी है:

  • कोल्ड स्टार्ट को रोकना (उपयोगकर्ता अनुभव और उन्हें अपने गेम से जोड़े रखना): जब कोई खिलाड़ी कुछ समय के लिए आपके गेम से हटकर कोई दूसरा काम करता है (उदाहरण के लिए, किसी सूचना का जवाब देना या कोई मैसेज देखना), तो ऑपरेटिंग सिस्टम, गेम की प्रोसेस को बैकग्राउंड में डाल देता है. अगर गेम के बैकग्राउंड में इस्तेमाल होने वाली मेमोरी का फ़ुटप्रिंट बहुत ज़्यादा है, तो सिस्टम का लो मेमोरी किलर (एलएमके), फ़ोरग्राउंड में चल रही प्रोसेस के लिए रैम खाली करने के लिए, गेम की प्रोसेस को बंद कर देता है. जब उपयोगकर्ता गेम को फिर से शुरू करता है, तो गेम को कोल्ड स्टार्ट करना पड़ता है. इसका मतलब है कि गेम को स्टोरेज से, भारी-भरकम ग्राफ़िक्स ऐसेट, ऑडियो, और गेम इंजन बाइनरी को पूरी तरह से फिर से लोड करना पड़ता है. ऐसा होने पर, गेम तुरंत शुरू नहीं होता. बैकग्राउंड में इस्तेमाल होने वाली मेमोरी को कम रखने से, बैकग्राउंड में चल रही प्रोसेस अपने-आप बंद नहीं होतीं. इससे उपयोगकर्ता की प्रोग्रेस सेव रहती है और खिलाड़ी तुरंत अपना सेशन फिर से शुरू कर पाते हैं. सिस्टम के एलएमके के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, Android Vitals - लो मेमोरी किलर गाइड देखें.
  • इकोसिस्टम और डिवाइस की स्थिरता: मेमोरी का सही तरीके से इस्तेमाल न करने और मेमोरी लीक होने से, सिस्टम की परफ़ॉर्मेंस खराब हो जाती है. जब सिस्टम में मेमोरी कम होती है, तो सिस्टम पर बहुत ज़्यादा दबाव पड़ता है. इससे फ़्रेम रेट कम हो जाता है, यूज़र इंटरफ़ेस (यूआई) में रुकावट आती है, और ऑडियो में गड़बड़ियां होती हैं. अगर मेमोरी पर बहुत ज़्यादा दबाव पड़ता है, तो सिस्टम का लो मेमोरी किलर (एलएमके), बैकग्राउंड में चल रही प्रोसेस को बंद कर देता है. इससे अन्य ऐप्लिकेशन को कोल्ड स्टार्ट होने में ज़्यादा समय लगता है और जब खिलाड़ी एक टास्क से दूसरे टास्क पर स्विच करते हैं, तो उनकी प्रोग्रेस सेव नहीं रहती.
  • प्लैटफ़ॉर्म-लेवल पर प्रोसेस बंद होना: Android 17 (एपीआई लेवल 37) से, सिस्टम उन प्रोसेस को बंद करने के लिए ज़्यादा सक्रिय रहता है जो बहुत ज़्यादा मेमोरी का इस्तेमाल करती हैं. अगर आपके गेम का फ़ुटप्रिंट बहुत ज़्यादा है, तो ओएस, स्टैंडर्ड स्टैक ट्रेस जनरेट किए बिना, उसकी प्रोसेस को अचानक बंद कर सकता है.
  • डिवाइस कंपैटिबिलिटी: फ़्लैगशिप डिवाइसों में 12 जीबी से 16 जीबी रैम होती है. हालांकि, दुनिया भर में गेम खेलने वाले ज़्यादातर लोग, 4 जीबी या 6 जीबी रैम वाले डिवाइसों का इस्तेमाल करते हैं. मेमोरी को सही तरीके से मैनेज करने से, यह पक्का किया जाता है कि आपका गेम, अलग-अलग हार्डवेयर टियर वाले सभी डिवाइसों पर ऐक्सेस किया जा सके और वह तेज़ी से काम करे. इसके लिए, अलग-अलग ऐसेट पैकेज की ज़रूरत नहीं होती.

Android में मेमोरी के बारे में जानकारी

मेमोरी-बजट की असरदार रणनीतियां बनाने के लिए, डेवलपर को यह समझना होगा कि Android प्लैटफ़ॉर्म, फ़िज़िकल मेमोरी को कैसे मैनेज करता है और वह आपके गेम के ऐक्टिव फ़ुटप्रिंट को कैसे मेज़र करता है.

Android की मेमोरी से जुड़े मुख्य सिद्धांत

प्लैटफ़ॉर्म-लेवल पर मेमोरी मैनेजमेंट से जुड़े बुनियादी सिद्धांतों के लिए, मेमोरी मैनेजमेंट की खास जानकारी से जुड़ा आधिकारिक दस्तावेज़ देखें. इस संसाधन में, आर्किटेक्चर के चार क्षेत्रों के बारे में बताया गया है:

  • मेमोरी की खास जानकारी: Android, रैम को मैनेज करने के लिए पेजिंग और मेमोरी-मैपिंग (एमएमएपी) का इस्तेमाल करता है. यह डिस्क पर पारंपरिक स्वैप फ़ाइल को सपोर्ट नहीं करता. इसके बजाय, यह फ़िज़िकल मेमोरी को खाली करने के लिए, पेज कंप्रेशन (ज़ेडआरएएम का इस्तेमाल करके) और पेज रिक्लेमेशन पर निर्भर करता है.
  • प्रोसेस के बीच मेमोरी का बंटवारा: Android, पूरे सिस्टम में रैम शेयर करता है. यह Dalvik या एआरटी वर्चुअल मशीन के एक्ज़ीक्यूशन के लिए, खास हीप असाइन करता है. वहीं, नेटिव डेवलपमेंट एनवायरमेंट (जैसे, C++ गेम इंजन) को नेटिव सिस्टम हीप से मेमोरी का अनुरोध करने की अनुमति देता है.
  • ऐप्लिकेशन मेमोरी मैनेजमेंट: मल्टी-प्रोसेस मॉडल के तहत काम करने वाला Android ऐप्लिकेशन से उम्मीद करता है कि वे अपने लाइफ़साइकल की स्थिति को डाइनैमिक तरीके से मॉनिटर करें और सिस्टम की परफ़ॉर्मेंस को बेहतर बनाए रखने के लिए, गैर-ज़रूरी संसाधनों (जैसे, अनकैश्ड ग्राफ़िक्स और बिटमैप) को रिलीज़ करें.
  • प्रोसेस और थ्रेड की खास जानकारी: सिस्टम, प्रोसेस को उनकी मौजूदा यूज़र-पर्सीव्ड विज़िबिलिटी और अहमियत के आधार पर, क्रम में बांटता है. इससे यह तय होता है कि कम मेमोरी होने पर, कौनसी प्रोसेस चालू रहेंगी और कौनसी प्रोसेस सबसे पहले बंद होंगी.

मेमोरी के कुल फ़ुटप्रिंट की मेट्रिक

प्लैटफ़ॉर्म-लेवल पर, Android 17 मेमोरी लिमिटर, प्रोसेस के इस्तेमाल का आकलन करने के लिए, कुल रेज़िडेंट साइज़ (आरएसएस) या वर्चुअल मेमोरी साइज़ के बजाय, मेमोरी के कुल फ़ुटप्रिंट का इस्तेमाल करता है.

मेमोरी का कुल फ़ुटप्रिंट = एनॉनिमस आरएसएस (आरएसएसएनॉन) + अनकंप्रेस्ड स्वैप (वीएमस्वैप)

गेम को प्लैटफ़ॉर्म की सीमाओं से ज़्यादा मेमोरी इस्तेमाल करने से रोकने के लिए, डेवलपर को यह समझना होगा कि सिस्टम लेवल पर ये मेट्रिक क्या दिखाती हैं. इन मेट्रिक, फ़िज़िकल रैम के बंटवारे, और फ़ाइल-बैक्ड पेजों को मैनेज करने के तरीके के बारे में ज़्यादा जानने के लिए, मेमोरी के इस्तेमाल की निगरानी करना गाइड में, आरएसएस और स्वैप मेट्रिक को समझना लेख पढ़ें.

मेमोरी की सीमाएं

सिस्टम की स्थिरता बनाए रखने और यह पक्का करने के लिए कि ऐप्लिकेशन, ज़रूरत से ज़्यादा संसाधनों का इस्तेमाल न करें, Android प्लैटफ़ॉर्म, चल रही प्रोसेस के लिए मेमोरी की सीमाओं को मैनेज करता है.

Android 17 और इसके बाद के वर्शन में मेमोरी लिमिटर

Android 17 (एपीआई लेवल 37) और इसके बाद के वर्शन, Linux cgroup v2 का इस्तेमाल करके, हर ऐप्लिकेशन के लिए मेमोरी की सख्त सीमाएं मैनेज करते हैं. इससे, कोई भी ऐप्लिकेशन पूरे सिस्टम की परफ़ॉर्मेंस को खराब नहीं कर पाता. तकनीकी तौर पर इसे लागू करने के बारे में ज़्यादा जानने के लिए, AOSP मेमोरी लिमिटर गाइड और Android 17 के लिए मेमोरी की बचत को प्राथमिकता देना: ज़रूरी चरण ब्लॉग देखें.

  • मैकेनिज़्म: मेमोरी लिमिटर, ऐप्लिकेशन की सभी प्रोसेस को मॉनिटर करता है और प्रोसेस के लाइफ़साइकल की स्थिति के आधार पर, डाइनैमिक तरीके से सीमाएं असाइन करता है:
    • दिखने वाली प्रोसेस (फ़ोरग्राउंड): फ़िलहाल, यूज़र इंटरफ़ेस (यूआई) दिखाने वाली ऐप्लिकेशन प्रोसेस से उम्मीद की जाती है कि वे ज़्यादा संसाधन इस्तेमाल करें. इसलिए, उन्हें ज़्यादा मेमोरी की सीमा दी जाती है.
    • न दिखने वाली प्रोसेस (बैकग्राउंड या सेवाएं): यूज़र इंटरफ़ेस (यूआई) दिखाए बिना, ऐक्टिव काम करने वाली ऐप्लिकेशन प्रोसेस के लिए, मेमोरी की सीमा कम होती है.
  • कर्नल एट्रिब्यूट: यह सेवा, दो मुख्य एट्रिब्यूट पर निर्भर करती है:
    • memory.high: यह एक सॉफ़्ट लिमिट है. इस सीमा से ज़्यादा मेमोरी इस्तेमाल करने पर, कर्नल, प्रोसेस को थ्रॉटल करता है और मेमोरी को वापस पाने की कोशिश करता है. मेमोरी को वापस पाने की इस प्रोसेस की वजह से, गेम की परफ़ॉर्मेंस खराब हो सकती है.
    • memory.swap.max: यह स्वैप या ज़ेडआरएएम स्पेस पर एक हार्ड कैप मैनेज करता है, जिसका इस्तेमाल प्रोसेस कर सकती है.
  • प्रोसेस बंद होने का तरीका: अगर कोई प्रोसेस, एनॉनिमस मेमोरी को memory.high से ज़्यादा असाइन करती है और उसकी स्वैप क्षमता खत्म हो जाती है, तो मेमोरी असाइन नहीं की जा सकती. इसके बाद, ओएस, प्रोसेस को बंद कर देता है. प्रोसेस बंद होने की जानकारी, मेमोरी लिमिटर के बंद होने की वजह के तहत, ApplicationExitInfo का इस्तेमाल करके लॉग की जाती है (यह सुविधा, Android 17, 26Q4 से उपलब्ध है).

मेमोरी के इस्तेमाल की निगरानी करना

अपने गेम की मेमोरी को ऑप्टिमाइज़ करने के लिए, आपको सबसे पहले यह समझना होगा कि Android प्लैटफ़ॉर्म, उसके फ़ुटप्रिंट को कैसे मेज़र करता है. Android 17, मेमोरी की मेट्रिक को अपडेट करता है. इससे, एनॉनिमस आरएसएस (आरएसएसएनॉन) और अनकंप्रेस्ड स्वैप (वीएमस्वैप) के योग को ट्रैक किया जाता है. इसमें, फ़ाइल-बैक्ड या जीपीयू-प्राइवेट मेमोरी शामिल नहीं होती. इस गाइड में, सिस्टम-लेवल के टूल, जैसे कि Perfetto और meminfo का इस्तेमाल करने, ProfilingManager और onTrimMemory जैसे डाइग्नोस्टिक एपीआई लागू करने, और Unity और Unreal Engine में मेमोरी के सटीक बंटवारे की जानकारी निकालने का तरीका बताया गया है. अपने गेम की सटीक प्रोफ़ाइल बनाने और पारंपरिक रनटाइम मेमोरी पोलिंग से जुड़ी परफ़ॉर्मेंस में आने वाली रुकावटों से बचने का तरीका जानें.

ज़्यादा जानकारी के लिए, मेमोरी के इस्तेमाल की निगरानी करना लेख पढ़ें.

मेमोरी कम करने की रणनीतियां

गेम इंजन, क्रॉस-प्लैटफ़ॉर्म डेवलपमेंट को आसान बनाते हैं. हालांकि, डिफ़ॉल्ट मेमोरी हैंडलिंग की वजह से, ओएस-लेवल पर मेमोरी की सीमाएं ट्रिगर हो सकती हैं. इस पेज पर, Unity और Unreal Engine के लिए खास तौर पर तैयार किए गए, ऑप्टिमाइज़ेशन के व्यावहारिक चरणों के बारे में बताया गया है. जानें कि Java पर आधारित onTrimMemory पर निर्भर रहने से, Unity में डेडलॉक क्यों हो सकते हैं. साथ ही, इसके बजाय नेटिव लाइफ़साइकल कॉलबैक का इस्तेमाल कैसे किया जा सकता है. आपको ऐसेट-लेवल के मुख्य ऑप्टिमाइज़ेशन के बारे में भी पता चलेगा. जैसे, एएसटीसी 8x8 टेक्सचर कंप्रेशन का इस्तेमाल करना और ऐसेट अनलोड को कॉन्फ़िगर करना. इससे आपका गेम, अलग-अलग हार्डवेयर टियर वाले सभी डिवाइसों पर आसानी से चल सकेगा.

ज़्यादा जानकारी के लिए, मेमोरी का इस्तेमाल कम करना लेख पढ़ें.