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

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

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

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

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

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

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

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

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

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

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

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

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

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

मेमोरी से जुड़ी पाबंदियां

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

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

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

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

Play Console की ज़रूरी जानकारी में मेमोरी की नई सीमाएं

डेवलपर को मेमोरी से जुड़ी समस्याओं की पहचान करने में मदद करने के लिए, Google Play, Play Console के Android की ज़रूरी जानकारी वाले सेक्शन में नई मेट्रिक जोड़ रहा है. Play Console, आपके गेम सेशन के 90वें पर्सेंटाइल (P90) के बिना सोर्स फ़ाइल वाली आरएसएस मेमोरी और स्वैप मेमोरी के फ़ुटप्रिंट को ट्रैक करता है, ताकि एक्सट्रीम आउटलायर की पहचान की जा सके.

चेतावनी और नीति उल्लंघन ठीक करने के लिए तय की गई सीमाएं, डिवाइस की फ़िज़िकल रैम की क्षमता और प्रोसेस की स्थितियों के आधार पर तय की जाती हैं. ये सीमाएं दो अलग-अलग चरणों में लागू होती हैं.

ज़्यादा जानकारी के लिए, Android की ज़रूरी जानकारी - 'ऐप्लिकेशन की खराब परफ़ॉर्मेंस के थ्रेशोल्ड क्या हैं? लेख पढ़ें.

उपयोगकर्ता को दिखने वाली सेवाएं

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

  • फ़ोरग्राउंड सेवाएं (एफ़जीएस)
  • हाई-प्रायाॅरिटी वाले टास्क
  • User-initiated data transfer jobs
  • सिस्टम से जुड़ी सेवाएं या अन्य ऐप्लिकेशन से जुड़ी सेवाएं

Perceptible Services को बैकग्राउंड में लंबे समय तक चलने वाले ज़रूरी टास्क के लिए डिज़ाइन किया गया है. इसलिए, ये Cumulative Lifecycle Leaks के लिए बहुत संवेदनशील होती हैं. Android प्लैटफ़ॉर्म की मेमोरी सीमाएं, इस स्थिति को फ़ोरग्राउंड में नहीं मानती हैं. इसका मतलब है कि अगर आपका गेम बैकग्राउंड में है, लेकिन वह Perceptible Service को चालू रखता है, तो उस पर बैकग्राउंड या सेवा की मेमोरी की ज़्यादा पाबंदियां लागू होंगी. ये पाबंदियां, Play के सहायता केंद्र पेज पर दिखाई गई हैं. जब गेम, फ़ोरग्राउंड से बैकग्राउंड में दिखने वाली सेवा की स्थिति में जाते हैं, तो उन्हें गैर-ज़रूरी ऐसेट को हटाना होगा.

R8 की ज़रूरी शर्तें

बाइटकोड के साइज़ को कम करने और बुनियादी Java प्रोसेस के ओवरहेड को कम करने के लिए, Google Play Console, ऐप्लिकेशन की क्वालिटी से जुड़े दिशा-निर्देशों के तहत कोड ऑप्टिमाइज़ेशन का आकलन करता है. अपनी बिल्ड पाइपलाइन को कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, R8 की मदद से ऐप्लिकेशन ऑप्टिमाइज़ करने की सुविधा चालू करना गाइड देखें.

अपने प्रोजेक्ट में R8 को कॉन्फ़िगर करने के लिए, R8 की मदद से ऐप्लिकेशन ऑप्टिमाइज़ करने की सुविधा चालू करना गाइड पढ़ें. ऐडवांस श्रिंकिंग और ऑप्टिमाइज़ेशन सेटिंग चालू करने के लिए, R8 को फ़ुल मोड में इस्तेमाल करना लेख पढ़ें. यह पता लगाने के लिए कि कौनसे नियमों की वजह से R8, क्लास को अस्पष्ट करने या डेड कोड को हटाने से रोक रहा है, R8 Configuration Analyzer का इस्तेमाल करें.

बिटमैप से जुड़ी ज़रूरी शर्तें

बिटमैप, मॉडर्न हाई-फ़िडेलिटी गेम में मेमोरी के इस्तेमाल का एक बड़ा हिस्सा होते हैं. Bitmap पिक्सल डेटा को सीधे तौर पर Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन पर, अनमैनेज्ड नेटिव हीप में सेव किया जाता है. इसलिए, इमेज को ऑप्टिमाइज़ किए बिना लोड करने पर, प्रोसेस को प्लैटफ़ॉर्म की मेमोरी थ्रेशोल्ड से आगे बढ़ाया जा सकता है. इमेज को स्केल करने और कैश मेमोरी में सेव करने के सबसे सही तरीकों के बारे में जानने के लिए, इमेज के इस्तेमाल को ऑप्टिमाइज़ करना लेख पढ़ें.

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

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

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

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

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

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