Android सिस्टम में, मेमोरी लिमिटर (Android 17+) के लिए मेमोरी लिमिट थ्रेशोल्ड और Google Play Console में मेमोरी की ज़रूरी जानकारी के लिए बेंचमार्क वैल्यू, 'anonymous RSS + swap' है. यह वैल्यू, प्रोसेस के लिए असल में इस्तेमाल की गई फ़िज़िकल मेमोरी के प्रेशर लेवल को दिखाती है. यह एक अहम मेट्रिक है. ऐप्लिकेशन के स्थिर तरीके से काम करने के लिए, इस पर नज़र रखना ज़रूरी है.
फ़िलहाल, Unity Engine में रनटाइम या स्टैटिक तौर पर, 'anonymous RSS + swap' के बराबर मेमोरी के इस्तेमाल को मेज़र करना मुश्किल है.
इस समस्या को हल करने के लिए, इस पेज पर यह बताया गया है कि Unity Engine के एनवायरमेंट में, Unity Profiler, ProfileRecorder API, और Unity Memory Profiler का इस्तेमाल करके, अनुमान के आधार पर 'anonymous RSS + swap' वैल्यू को ज़्यादा भरोसेमंद तरीके से कैसे ट्रैक किया जा सकता है.
रनटाइम के दौरान मेमोरी के इस्तेमाल की जानकारी देखना
Unity में, Android के सटीक 'anonymous RSS + swap' मेमोरी के इस्तेमाल को रनटाइम के दौरान, बिना किसी ओवरहेड के सीधे तौर पर मेज़र करना मुश्किल हो सकता है. हालांकि, Unity के बिल्ट-इन Profiler API का इस्तेमाल करके, इस वैल्यू का सटीक अनुमान लगाया जा सकता है. इसमें ~10% तक का अंतर हो सकता है.
पहला तरीका: Profiler का इस्तेमाल करना
कुल मेमोरी के इस्तेमाल का अनुमान लगाने के लिए, Profiler API से मिली वैल्यू को जोड़ा जा सकता है:
using UnityEngine;
using UnityEngine.Profiling;
public class MemoryMonitor : MonoBehaviour
{
public long GetEstimatedMemoryUsageBytes()
{
long totalReserved = Profiler.GetTotalReservedMemoryLong();
long monoHeapSize = Profiler.GetMonoHeapSizeLong();
return totalReserved + monoHeapSize;
}
}
दूसरा तरीका: ProfilerRecorder क्लास का इस्तेमाल करना
ProfilerRecorder का इस्तेमाल करके, Total Reserved Memory और Gfx Reserved Memory मेट्रिक को ट्रैक किया जा सकता है:
डेवलपमेंट बिल्ड में: 'Total Reserved Memory' - 'Gfx Reserved Memory' की वैल्यू का हिसाब लगाएं.
रिलीज़ बिल्ड में: सीधे तौर पर 'Total Reserved Memory' का इस्तेमाल करें.
using Unity.Profiling;
using UnityEngine;
public class MemoryMonitor : MonoBehaviour
{
ProfilerRecorder totalRecorder;
#if DEVELOPMENT_BUILD
ProfilerRecorder gfxRecorder;
#endif
private void OnEnable()
{
totalRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");
#if DEVELOPMENT_BUILD
gfxRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Gfx Reserved Memory");
#endif
}
private void OnDisable()
{
totalRecorder.Dispose();
#if DEVELOPMENT_BUILD
gfxRecorder.Dispose();
#endif
}
public long GetEstimatedMemoryUsageBytes()
{
#if DEVELOPMENT_BUILD
if (totalRecorder.Valid && gfxRecorder.Valid)
{
return totalRecorder.LastValue - gfxRecorder.LastValue;
}
#else
if (totalRecorder.Valid)
{
return totalRecorder.LastValue;
}
#endif
return 0;
}
}
सीमाएं:
मेमोरी के बंटवारे को इन एपीआई से ट्रैक नहीं किया जा सकता.जैसे, NativeMalloc(IntPtr size). ऐसा इसलिए, क्योंकि ये बंटवारे Unity के Memory Manager के ज़रिए नहीं किए जाते.
आपके Unity वर्शन के हिसाब से, हो सकता है कि ये एपीआई काम न करें.
मेमोरी के बंटवारे का विश्लेषण करना (स्टैटिक विश्लेषण)
अगर रनटाइम के दौरान, मेमोरी के ज़्यादा इस्तेमाल का पता चलता है, तो आपको यह पता लगाना होगा कि मेमोरी कहां इस्तेमाल हो रही है. मेमोरी के बंटवारे का विश्लेषण करने से, गैर-ज़रूरी बंटवारे को खत्म किया जा सकता है. साथ ही, गेम के लिए इस्तेमाल होने वाली कुल मेमोरी को कम किया जा सकता है.
Unity Memory Profiler
मेमोरी का गहराई से विश्लेषण करने और अपने गेम को ऑप्टिमाइज़ करने के लिए, Unity Memory Profiler पैकेज का इस्तेमाल करें. Android OS 'anonymous RSS + swap' के इस्तेमाल से जुड़े आइटम ढूंढने के लिए:
- Unity Memory Profiler का इस्तेमाल करके, स्नैपशॉट कैप्चर करें.
- स्नैपशॉट खोलें और All of Memory > Resident Memory on Device पर जाएं.
इन आइटम की वैल्यू को जोड़ें:
- Untracked
- Android रनटाइम
- नेटिव
- मैनेज किया गया
पहली इमेज. मेमोरी की जानकारी, रेसिडेंट मेमोरी में सेव होती है
इन सभी वैल्यू को जोड़ने पर मिलने वाली वैल्यू, Android OS के 'anonymous RSS + swap' के लिए एक विकल्प के तौर पर काम करती है. इससे गेम की मेमोरी के विश्लेषण के लिए, कार्रवाई करने लायक अहम जानकारी मिलती है.
सीमाएं:
मेमोरी पर ज़्यादा प्रेशर पड़ने पर, Android OS, ऐक्टिव मेमोरी पेजों को कंप्रेस या स्वैप कर सकता है, ताकि रैम खाली की जा सके. Unity Memory Profiler, स्वैप की गई मेमोरी को ट्रैक नहीं कर सकता. इसलिए, मेमोरी के ज़्यादा इस्तेमाल के दौरान, गड़बड़ियां हो सकती हैं.
आपके Unity वर्शन के हिसाब से, हो सकता है कि ये सुविधाएं सीमित हों.
ज़्यादा सटीक आकलन
Android OS की सटीक 'anonymous RSS + swap' वैल्यू की पुष्टि करने के लिए, Perfetto का इस्तेमाल करें. इससे, सिस्टम-लेवल पर मेमोरी के सटीक इस्तेमाल को मेज़र किया जा सकता है. साथ ही, आपके गेम के लिए इस्तेमाल होने वाली मेमोरी का पूरी तरह से विश्लेषण किया जा सकता है.