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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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