Unity टूल की मदद से मेमोरी के इस्तेमाल की जांच करने का तरीका

Android सिस्टम में, Memory Limiter (Android 17+) के लिए मेमोरी की सीमा का थ्रेशोल्ड और Google Play Console में मेमोरी की ज़रूरी जानकारी के लिए बेंचमार्क वैल्यू, 'anonymous RSS + swap' है. यह वैल्यू, प्रोसेस के लिए इस्तेमाल की गई फ़िज़िकल मेमोरी के लेवल को दिखाती है. यह एक अहम मेट्रिक है. ऐप्लिकेशन के सही तरीके से काम करने के लिए, इस पर नज़र रखना ज़रूरी है.

फ़िलहाल, Unity Engine में रनटाइम या स्टैटिक तौर पर, 'गुमनाम आरएसएस + स्वैप' से मेल खाने वाले मेमोरी इस्तेमाल का सटीक आकलन करना मुश्किल है.

इस समस्या को हल करने के लिए, इस पेज पर यह बताया गया है कि Unity Engine के एनवायरमेंट में, Unity Profiler, ProfileRecorder API, और Unity Memory Profiler का इस्तेमाल करके, 'anonymous RSS + swap' वैल्यू को ज़्यादा भरोसेमंद तरीके से कैसे ट्रैक किया जा सकता है.

रनटाइम के दौरान मेमोरी के इस्तेमाल की जानकारी देखना

Unity में, रनटाइम के दौरान Android के 'anonymous RSS + swap' मेमोरी के सटीक इस्तेमाल का आकलन करना मुश्किल हो सकता है. हालांकि, Unity के बिल्ट-इन Profiler API का इस्तेमाल करके, इस वैल्यू का अनुमान लगाया जा सकता है. इसमें ~10% का अंतर हो सकता है.

पहला तरीका: प्रोफ़ाइलर का इस्तेमाल करना

कुल मेमोरी के इस्तेमाल का अनुमान लगाने के लिए, यहां दिए गए प्रोफ़ाइलर एपीआई से मिली वैल्यू को जोड़ा जा सकता है:

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 का इस्तेमाल करके, कुल रिज़र्व की गई मेमोरी और GFX के लिए रिज़र्व की गई मेमोरी मेट्रिक को ट्रैक किया जा सकता है:

  • डेवलपमेंट बिल्ड में: 'कुल रिज़र्व की गई मेमोरी' - 'Gfx के लिए रिज़र्व की गई मेमोरी' का हिसाब लगाएं.

  • रिलीज़ बिल्ड में: सीधे तौर पर 'कुल रिज़र्व की गई मेमोरी' का इस्तेमाल करें.

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;
    }
}

सीमाएं:

  • मेमोरी के ऐसे असाइनमेंट जिन्हें Unity के Memory Manager से नहीं किया जाता (जैसे, NativeMalloc(IntPtr size)), उन्हें इन एपीआई से ट्रैक नहीं किया जा सकता.

  • ऐसा हो सकता है कि ये एपीआई, Unity के आपके वर्शन के साथ काम न करें.

मेमोरी ब्रेकडाउन का विश्लेषण करना (स्टैटिक विश्लेषण)

अगर रनटाइम के दौरान ज़्यादा मेमोरी इस्तेमाल होने का पता चलता है, तो आपको यह पता लगाना होगा कि मेमोरी कहां इस्तेमाल हो रही है. मेमोरी डिस्ट्रिब्यूशन का विश्लेषण करने से, गैर-ज़रूरी मेमोरी को हटाने और गेम के कुल मेमोरी फ़ुटप्रिंट को कम करने में मदद मिलती है.

Unity Memory Profiler

मेमोरी का बेहतर तरीके से विश्लेषण करने और अपने गेम को ऑप्टिमाइज़ करने के लिए, Unity Memory Profiler पैकेज का इस्तेमाल करें. Android OS के 'anonymous RSS + swap' के इस्तेमाल से जुड़े आइटम ढूंढने के लिए:

  1. Unity Memory Profiler का इस्तेमाल करके स्नैपशॉट कैप्चर करें.
  2. स्नैपशॉट खोलें और सभी मेमोरी > डिवाइस पर मौजूद मेमोरी पर जाएं.
  3. इन आइटम का योग निकालो:

    • ट्रैक नहीं किया गया
    • Android रनटाइम
    • नेटिव
    • मैनेज किया गया
    Unity Memory Profiler में, मेमोरी की मेट्रिक को Resident Memory पर सेट करने पर ही देखा जा सकता है
    पहली इमेज. मेमोरी के ब्यौरे, रेज़िडेंट मेमोरी में सेव किए जाते हैं

कुल योग, Android OS के 'बिना सोर्स फ़ाइल वाली आरएसएस मेमोरी + स्वैप' के विकल्प के तौर पर काम करता है. इससे गेम की मेमोरी का विश्लेषण करके, कार्रवाई करने लायक अहम जानकारी मिलती है.

सीमाएं:

  • मेमोरी पर ज़्यादा दबाव पड़ने पर, Android OS, RAM को खाली करने के लिए, चालू मेमोरी पेजों को कंप्रेस या स्वैप कर सकता है. Unity Memory Profiler, स्वैप की गई मेमोरी को ट्रैक नहीं कर सकता. इसलिए, मेमोरी का ज़्यादा इस्तेमाल होने पर गड़बड़ियां हो सकती हैं.

  • Unity के वर्शन के हिसाब से, इन सुविधाओं का इस्तेमाल सीमित तौर पर किया जा सकता है.

ज़्यादा सटीक आकलन

Android OS की 'anonymous RSS + swap' वैल्यू की पुष्टि करने के लिए, Perfetto का इस्तेमाल करें. इससे आपको सिस्टम-लेवल पर मेमोरी के इस्तेमाल का सटीक आकलन करने में मदद मिलती है. साथ ही, इससे आपके गेम के मेमोरी फ़ुटप्रिंट का पूरी तरह से विश्लेषण किया जा सकता है.

Perfetto यूज़र इंटरफ़ेस (यूआई) की इमेज. इसमें बिना सोर्स फ़ाइल वाली आरएसएस मेमोरी, स्वैप मेमोरी, और उनकी कुल क्वेरी दिखाई गई है.
दूसरी इमेज. Perfetto यूज़र इंटरफ़ेस (यूआई) की इमेज. इसमें बिना सोर्स फ़ाइल वाली आरएसएस मेमोरी, स्वैप मेमोरी, और उनकी कुल क्वेरी दिखाई गई है.