Android पर, गेमिंग का बेहतर और स्थिर अनुभव देने के लिए, मेमोरी को ऑप्टिमाइज़ करना ज़रूरी है. इस गाइड में, मेमोरी की बचत करने की अहमियत के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि Android ऑपरेटिंग सिस्टम, प्रोसेस की मेमोरी की सीमाओं को कैसे मैनेज और लागू करता है. इसके अलावा, Google Play Console में नई थ्रेशोल्ड के बारे में भी बताया गया है. इनकी मदद से, अपने गेम की तकनीकी क्वालिटी को मॉनिटर और बेहतर बनाया जा सकता है.
मेमोरी ऑप्टिमाइज़ेशन की अहमियत
अपने गेम की मेमोरी को ऑप्टिमाइज़ करना ज़रूरी है, ताकि खिलाड़ी आपके गेम से जुड़े रहें, डिवाइसों के साथ इसकी कंपैटिबिलिटी बढ़ाई जा सके, और प्लैटफ़ॉर्म के क्वालिटी स्टैंडर्ड का पालन किया जा सके:
- कोल्ड स्टार्ट को रोकना (उपयोगकर्ता अनुभव और जुड़ाव): जब कोई खिलाड़ी कुछ समय के लिए आपके गेम से हटता है (उदाहरण के लिए, किसी सूचना का जवाब देने या मैसेज देखने के लिए), तो ऑपरेटिंग सिस्टम, गेम की प्रोसेस को बैकग्राउंड में डाल देता है. अगर गेम की बैकग्राउंड मेमोरी का फ़ुटप्रिंट बहुत ज़्यादा है, तो सिस्टम का लो मेमोरी किलर (एलएमके), फ़ोरग्राउंड में चल रही प्रोसेस के लिए रैम खाली करने के लिए, गेम की प्रोसेस को बंद कर देता है. अगली बार जब उपयोगकर्ता गेम को फिर से शुरू करता है, तो गेम को कोल्ड स्टार्ट करना पड़ता है. इसका मतलब है कि गेम को स्टोरेज से, भारी-भरकम ग्राफ़िक्स ऐसेट, ऑडियो, और गेम इंजन बाइनरी को पूरी तरह से फिर से लोड करना पड़ता है. ऐसा होने पर, गेम तुरंत शुरू नहीं होता. बैकग्राउंड में मेमोरी के इस्तेमाल को कम रखने से, बैकग्राउंड में चल रही प्रोसेस को बंद होने से रोका जा सकता है. इससे उपयोगकर्ता की प्रोग्रेस सेव रहती है और खिलाड़ी तुरंत अपना सेशन फिर से शुरू कर पाते हैं. सिस्टम के एलएमके के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, Android की ज़रूरी जानकारी - लो मेमोरी किलर गाइड देखें.
- इकोसिस्टम और डिवाइस की स्थिरता: मेमोरी का सही तरीके से इस्तेमाल न करने और मेमोरी लीक होने से, सिस्टम की परफ़ॉर्मेंस खराब हो जाती है. जब सिस्टम में मेमोरी कम होती है, तो सिस्टम पर बहुत ज़्यादा दबाव पड़ता है. इससे फ़्रेम रेट कम हो जाता है, यूज़र इंटरफ़ेस (यूआई) में रुकावट आती है, और ऑडियो में गड़बड़ियां होती हैं. अगर मेमोरी पर बहुत ज़्यादा दबाव पड़ता है, तो सिस्टम का लो मेमोरी किलर (एलएमके), बैकग्राउंड में चल रही प्रोसेस को बंद कर देता है. इससे अन्य ऐप्लिकेशन को कोल्ड स्टार्ट होने में ज़्यादा समय लगता है और जब खिलाड़ी एक टास्क से दूसरे टास्क पर स्विच करते हैं, तो उनकी प्रोग्रेस सेव नहीं रहती.
- प्लैटफ़ॉर्म-लेवल पर प्रोसेस बंद करना: Android 17 (एपीआई लेवल 37) से, सिस्टम उन प्रोसेस को बंद करने के लिए ज़्यादा सक्रिय रहता है जो बहुत ज़्यादा मेमोरी का इस्तेमाल करती हैं. अगर आपके गेम का फ़ुटप्रिंट बहुत ज़्यादा है, तो ओएस, स्टैंडर्ड स्टैक ट्रेस जनरेट किए बिना, इसकी प्रोसेस को अचानक बंद कर सकता है.
- डिवाइस कंपैटिबिलिटी: फ़्लैगशिप डिवाइसों में 12 जीबी से 16 जीबी रैम होती है. हालांकि, दुनिया भर में गेम खेलने वाले ज़्यादातर लोग, 4 जीबी या 6 जीबी रैम वाले डिवाइसों का इस्तेमाल करते हैं. मेमोरी को सही तरीके से मैनेज करने से, यह पक्का किया जाता है कि आपका गेम, सभी हार्डवेयर टियर पर ऐक्सेस किया जा सके और रिस्पॉन्सिव बना रहे. इसके लिए, अलग-अलग ऐसेट पैकेज की ज़रूरत नहीं होती.
Android में मेमोरी के बारे में जानकारी
मेमोरी बजटिंग की असरदार रणनीतियां बनाने के लिए, डेवलपर को यह समझना होगा कि Android प्लैटफ़ॉर्म, फ़िज़िकल मेमोरी को कैसे मैनेज करता है और यह आपके गेम के ऐक्टिव फ़ुटप्रिंट को कैसे मेज़र करता है.
Android की मेमोरी से जुड़े मुख्य कॉन्सेप्ट
प्लैटफ़ॉर्म-लेवल पर मेमोरी मैनेजमेंट से जुड़े बुनियादी कॉन्सेप्ट के लिए, मेमोरी मैनेजमेंट की खास जानकारी से जुड़ा आधिकारिक दस्तावेज़ देखें. इस संसाधन में, आर्किटेक्चर के चार क्षेत्रों के बारे में बताया गया है:
- मेमोरी की खास जानकारी: Android, रैम को मैनेज करने के लिए पेजिंग और मेमोरी-मैपिंग (एमएमएपी) का इस्तेमाल करता है. यह डिस्क पर पारंपरिक स्वैप फ़ाइल को सपोर्ट नहीं करता. इसके बजाय, यह फ़िज़िकल मेमोरी को खाली करने के लिए, पेज कंप्रेशन (ज़ेडआरएएम का इस्तेमाल करके) और पेज रिक्लेमेशन पर निर्भर करता है.
- प्रोसेस के बीच मेमोरी का बंटवारा: Android, पूरे सिस्टम में रैम शेयर करता है. यह Dalvik या ART वर्चुअल मशीन के एक्ज़ीक्यूशन के लिए, खास हीप असाइन करता है. साथ ही, नेटिव डेवलपमेंट एनवायरमेंट (जैसे, C++ गेम इंजन) को नेटिव सिस्टम हीप से मेमोरी का अनुरोध करने की अनुमति देता है.
- ऐप्लिकेशन मेमोरी मैनेजमेंट: मल्टी-प्रोसेस मॉडल के तहत काम करने वाला Android ऐप्लिकेशन से उम्मीद करता है कि वे अपने लाइफ़साइकल की स्थिति को डाइनैमिक तरीके से मॉनिटर करें और सिस्टम की परफ़ॉर्मेंस को बेहतर बनाए रखने के लिए, गैर-ज़रूरी संसाधनों (जैसे, अनकैश्ड ग्राफ़िक्स और बिटमैप) को रिलीज़ करें.
- प्रोसेस और थ्रेड की खास जानकारी: सिस्टम, प्रोसेस को उनकी मौजूदा यूज़र-पर्सीव्ड विज़िबिलिटी और अहमियत के आधार पर, क्रम में बांटता है. इससे यह तय होता है कि कम मेमोरी होने पर, कौनसी प्रोसेस चालू रहेंगी और कौनसी प्रोसेस सबसे पहले बंद होंगी.
कुल मेमोरी फ़ुटप्रिंट मेट्रिक
प्लैटफ़ॉर्म-लेवल पर, Android 17 का मेमोरी लिमिटर, प्रोसेस के इस्तेमाल का आकलन करने के लिए, कुल रेज़िडेंट साइज़ (आरएसएस) या वर्चुअल मेमोरी साइज़ के बजाय, कुल मेमोरी फ़ुटप्रिंट का इस्तेमाल करता है.
कुल मेमोरी फ़ुटप्रिंट = एनोनिमस आरएसएस (आरएसएसएनॉन) + अनकंप्रेस्ड स्वैप (वीएमस्वैप)
गेम को प्लैटफ़ॉर्म-लेवल पर लागू की गई सीमाओं से ज़्यादा मेमोरी इस्तेमाल करने से रोकने के लिए, डेवलपर को यह समझना होगा कि सिस्टम लेवल पर ये मेट्रिक क्या दिखाती हैं. इन मेट्रिक, फ़िज़िकल रैम के बंटवारे, और फ़ाइल-बैक्ड पेजों को मैनेज करने के तरीके के बारे में ज़्यादा जानने के लिए, आरएसएस और स्वैप मेट्रिक को समझना गाइड में, मेमोरी के इस्तेमाल की निगरानी करना देखें.
मेमोरी की सीमाएं
सिस्टम की स्थिरता बनाए रखने और यह पक्का करने के लिए कि ऐप्लिकेशन, ज़रूरत से ज़्यादा संसाधनों का इस्तेमाल न करें, Android प्लैटफ़ॉर्म, चल रही प्रोसेस पर मेमोरी की सीमाएं लागू करता है.
Android 17 और इसके बाद के वर्शन में मेमोरी लिमिटर
Android 17 और इसके बाद के वर्शन, 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 में डेडलॉक क्यों हो सकते हैं. साथ ही, इसके बजाय नेटिव लाइफ़साइकल कॉलबैक का इस्तेमाल कैसे किया जा सकता है. आपको ऐसेट-लेवल के ऑप्टिमाइज़ेशन के बारे में भी पता चलेगा. जैसे, ASTC 8x8 टेक्सचर कंप्रेशन का इस्तेमाल करना और ऐसेट अनलोड को कॉन्फ़िगर करना. इससे आपका गेम, सभी हार्डवेयर टियर पर आसानी से चल सकेगा.