ইউনিটি টুলস ব্যবহার করে কীভাবে মেমরি ব্যবহার পরীক্ষা করবেন

অ্যান্ড্রয়েড সিস্টেমে, মেমরি লিমিটারের (অ্যান্ড্রয়েড ১৭+) জন্য মেমরি লিমিট থ্রেশহোল্ড এবং গুগল প্লে কনসোলে মেমরি ভাইটালের বেঞ্চমার্ক ভ্যালু হলো ' অ্যানোনিমাস আরএসএস + সোয়াপ '। এই ভ্যালুটি প্রসেস দ্বারা প্রকৃতপক্ষে ব্যবহৃত ফিজিক্যাল মেমরির চাপের মাত্রা নির্দেশ করে এবং এটি একটি অত্যন্ত গুরুত্বপূর্ণ মেট্রিক যা অ্যাপের স্থিতিশীল পরিচালনার জন্য অবশ্যই পর্যবেক্ষণ করতে হবে।

বর্তমানে, রানটাইমে অথবা ইউনিটি ইঞ্জিনের অভ্যন্তরে স্ট্যাটিক্যালি 'অ্যানোনিমাস আরএসএস + সোয়াপ'-এর সাথে হুবহু মিলে যায় এমন মেমরি ব্যবহার পরিমাপ করা কঠিন।

এই সমস্যা সমাধানের জন্য, এই পৃষ্ঠায় দেখানো হয়েছে কিভাবে একটি ইউনিটি ইঞ্জিন পরিবেশে ইউনিটি প্রোফাইলার, প্রোফাইলরেকর্ডার এপিআই, এবং ইউনিটি মেমোরি প্রোফাইলার ব্যবহার করে আনুমানিক পদ্ধতির মাধ্যমে উচ্চ নির্ভরযোগ্যতার সাথে ' অ্যানোনিমাস আরএসএস + সোয়াপ ' মান ট্র্যাক করা যায়।

রানটাইমে মেমরি ব্যবহার পরীক্ষা করুন

ইউনিটিতে, রানটাইমে ওভারহেড ছাড়া অ্যান্ড্রয়েডের সঠিক ' অ্যানোনিমাস আরএসএস + সোয়াপ ' মেমরি ব্যবহার সরাসরি পরিমাপ করা কঠিন হতে পারে। তবে, ইউনিটির বিল্ট-ইন প্রোফাইলার এপিআই ব্যবহার করে আপনি এই মানটি (প্রায় ১০% তারতম্যের মধ্যে) বেশ কাছাকাছি অনুমান করতে পারেন।

পদ্ধতি ১: প্রোফাইলার ব্যবহার করুন

নিম্নলিখিত প্রোফাইলার এপিআইগুলো থেকে প্রাপ্ত মানগুলো যোগ করে আপনি মোট মেমরি ব্যবহারের একটি আনুমানিক হিসাব করতে পারেন:

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 ' ব্যবহার করুন।

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)), সেগুলো এই API-গুলোর দ্বারা ট্র্যাক করা যায় না।

  • আপনার ইউনিটি ভার্সনের উপর নির্ভর করে এই এপিআইগুলো সমর্থিত নাও হতে পারে।

স্মৃতি বিভাজন বিশ্লেষণ করুন (স্থির বিশ্লেষণ)

রানটাইমে যদি উচ্চ মেমরি ব্যবহার শনাক্ত করা হয়, তবে মেমরি কোথা থেকে ব্যবহৃত হচ্ছে তা আপনাকে চিহ্নিত করতে হবে। মেমরি বণ্টন বিশ্লেষণ করলে আপনি অপ্রয়োজনীয় অ্যালোকেশন বাদ দিতে এবং গেমটির সামগ্রিক মেমরি ব্যবহার কমাতে পারবেন।

ইউনিটি মেমরি প্রোফাইলার

আপনার গেমের মেমরি গভীরভাবে বিশ্লেষণ করতে এবং অপ্টিমাইজ করতে, ইউনিটি মেমরি প্রোফাইলার প্যাকেজটি ব্যবহার করুন। অ্যান্ড্রয়েড ওএস-এর ' অ্যানোনিমাস আরএসএস + সোয়াপ ' ব্যবহারের সাথে সম্পর্কিত আইটেমগুলি সনাক্ত করতে:

  1. ইউনিটি মেমোরি প্রোফাইলার ব্যবহার করে একটি স্ন্যাপশট নিন।
  2. স্ন্যাপশটটি খুলুন এবং All of Memory > Resident Memory on Device- এ যান।
  3. নিম্নলিখিত আইটেমগুলির যোগফল গণনা করুন:

    • ট্র্যাকবিহীন
    • অ্যান্ড্রয়েড রানটাইম
    • স্থানীয়
    • পরিচালিত
    ইউনিটি মেমোরি প্রোফাইলার-এ রেসিডেন্ট মেমোরি সেট করা থাকলে মেমোরি মেট্রিক্স দেখা যায়।
    চিত্র ১. মেমরি বর্ণনাগুলো রেসিডেন্ট মেমরিতে সংরক্ষিত থাকে।

এই মোট যোগফলটি অ্যান্ড্রয়েড ওএস-এর ' অ্যানোনিমাস আরএসএস + সোয়াপ' -এর একটি কার্যকর বিকল্প হিসেবে কাজ করে, যা গেম মেমরি বিশ্লেষণের জন্য কার্যকরী অন্তর্দৃষ্টি প্রদান করে।

সীমাবদ্ধতা :

  • অতিরিক্ত মেমোরির চাপের সময়, অ্যান্ড্রয়েড ওএস র‍্যাম খালি করার জন্য সক্রিয় মেমোরি পেজগুলোকে কম্প্রেস বা সোয়াপ করতে পারে। যেহেতু ইউনিটি মেমোরি প্রোফাইলার সোয়াপ করা মেমোরি ট্র্যাক করতে পারে না, তাই উচ্চ মেমোরি ব্যবহারের ক্ষেত্রে গরমিল দেখা দিতে পারে।

  • আপনার ইউনিটি ভার্সনের উপর নির্ভর করে এই ফিচারগুলো সীমিত হতে পারে।

আরও সঠিক মূল্যায়ন

অ্যান্ড্রয়েড ওএস-এর সঠিক ' অ্যানোনিমাস আরএসএস + সোয়াপ ' মান যাচাই করতে পারফেটটো ব্যবহার করুন। এটি আপনাকে সিস্টেম-স্তরের মেমরি ব্যবহারের নির্ভুল পরিমাপ করতে এবং আপনার গেমের মেমরি ফুটপ্রিন্ট পুঙ্খানুপুঙ্খভাবে বিশ্লেষণ করতে দেয়।