মেমরি ব্যবহার নিরীক্ষণ করুন

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

আরএসএস এবং সোয়াপ মেট্রিক্স বোঝা

আপনার গেমের মেমরি আচরণ কার্যকরভাবে বিশ্লেষণ ও ডিবাগ করার জন্য, অ্যান্ড্রয়েড প্ল্যাটফর্ম মেমরি ব্যবস্থাপনার জন্য যে সুনির্দিষ্ট প্রযুক্তিগত মেট্রিকগুলো ব্যবহার করে, তা আপনাকে অবশ্যই বুঝতে হবে। বাস্তবে এই টেলিমেট্রি প্যারামিটারটি কীভাবে প্রক্রিয়াজাত ও পর্যবেক্ষণ করা হয়, সে সম্পর্কে বিস্তারিত তথ্যের জন্য অ্যান্ড্রয়েড ভাইটালস - মেমরি ব্যবহার (অ্যানোনিমাস আরএসএস + সোয়াপ) ডকুমেন্টেশনটি দেখুন।

১. বেনামী আরএসএস (আরএসএসঅ্যানন)

রেসিডেন্ট সেট সাইজ (RSS) কোনো প্রসেস দ্বারা দখলকৃত মেমরির সেই অংশকে পরিমাপ করে, যা ডিভাইসের ফিজিক্যাল র‍্যামে অবস্থান করে। RSS-কে ফাইল-ব্যাকড মেমরি এবং অ্যানোনিমাস মেমরিতে বিভক্ত করা হয়। অ্যান্ড্রয়েডের মেমরি মেট্রিক কঠোরভাবে অ্যানোনিমাস RSS-এর উপরই আলোকপাত করে:

  • এর অন্তর্ভুক্ত বিষয়সমূহ : আপনার গেম প্রসেস দ্বারা সরাসরি বরাদ্দকৃত মেমরি পেজ, যা স্টোরেজের কোনো ফিজিক্যাল ফাইলের সাথে সংযুক্ত নয়। এই পেজগুলোর মধ্যে রয়েছে জাভা বা কোটলিন হিপ, থ্রেড এক্সিকিউশন স্ট্যাক এবং সবচেয়ে গুরুত্বপূর্ণভাবে, নেটিভ মেমরি অ্যালোকেশন (যেমন কাস্টম C++ ইঞ্জিন অ্যালোকেটর, অথবা নেটিভ malloc বা new ব্যবহার করে অনুরোধ করা এবং গেম লজিক দ্বারা ডার্ট করা মেমরি ব্লক)। প্রসেস মেমরি (RSS) ডিকশনারির অধীনে এই মেট্রিকটি সম্পর্কে আরও জানুন।
  • কেন এটি গুরুত্বপূর্ণ : গেম ইঞ্জিনগুলো ফিজিক্স, রেন্ডারিং এবং লজিক পরিচালনার জন্য বিশাল নেটিভ মেমরি পুল ব্যবহার করে। যেহেতু এই পুলগুলো কোনো ফাইল দ্বারা সমর্থিত নয়, তাই এগুলো সম্পূর্ণরূপে অ্যানোনিমাস আরএসএস (Anonymous RSS)-এ থাকে এবং আপনার গেমের ফিজিক্যাল ফুটপ্রিন্টের সিংহভাগ গঠন করে।

২. অসংকুচিত সোয়াপ (VmSwap)

ফ্ল্যাশ স্টোরেজের ক্ষয় এবং ল্যাটেন্সি সীমাবদ্ধতার কারণে অ্যান্ড্রয়েড প্রচলিত ডিস্ক-ভিত্তিক সোয়াপ স্পেস সমর্থন করে না। এর পরিবর্তে, এটি zRAM (আনকম্প্রেসড সোয়াপ) ব্যবহার করে।

  • এর মধ্যে যা অন্তর্ভুক্ত : যখন ফিজিক্যাল র‍্যামের উপর চাপ বাড়ে, তখন কার্নেলের মেমরি ম্যানেজমেন্ট ডেমন নিষ্ক্রিয় অ্যানোনিমাস পেজগুলোকে কম্প্রেস করে এবং সেগুলোকে ফিজিক্যাল র‍্যামের একটি নির্দিষ্ট, অকম্প্রেসড অংশে (zRAM) সরিয়ে নিয়ে যায়।
  • মেট্রিক গণনা : সিস্টেমটি গেমের প্রকৃত ফিজিক্যাল মেমরি চাহিদা মূল্যায়ন করার জন্য আনকম্প্রেসড সাইজের (VmSwap) উপর ভিত্তি করে এটি ট্র্যাক করে। যদি আপনার গেম মেমরি বরাদ্দ করে এবং সিস্টেম তা zRAM-এ সোয়াপ করে, তবুও এটি আপনার গেমের মোট মেমরি ফুটপ্রিন্টের মধ্যে গণনা করা হয়।

৩. প্রক্রিয়া অবস্থা

অ্যান্ড্রয়েড ভাইটালস-এ প্রসেসের অবস্থা অনুযায়ী মেমরি ব্যবহারের বিস্তারিত বিবরণ দেখানো হয়। গেম ডেভেলপারদের ক্ষেত্রে, থার্ড-পার্টি এসডিকে বা গেমগুলোও অপ্রত্যাশিতভাবে ব্যবহারকারীর কাছে দৃশ্যমান সার্ভিস অথবা ব্যাকগ্রাউন্ড সার্ভিস চালু করে দিতে পারে।

  • এর অন্তর্ভুক্ত বিষয়গুলো হলো : ফোরগ্রাউন্ড, উপলব্ধিযোগ্য পরিষেবা, ব্যাকগ্রাউন্ড এবং ক্যাশড।
  • কেন এটি গুরুত্বপূর্ণ : বিভিন্ন প্রসেস স্টেট অ্যান্ড্রয়েড ওএস-এর মেমরি ম্যানেজমেন্টের উপর ভিন্ন ভিন্ন প্রভাব ফেলে। যদি কোনো থার্ড-পার্টি SDK অনিচ্ছাকৃতভাবে কোনো ব্যাকগ্রাউন্ড টাস্ক চালু করে, তবে আপনি হয়তো জানতেও পারবেন না যে আপনার গেমটি একটি সংবেদনশীল প্রসেস স্টেটে চলছে। RunningAppProcessInfo ব্যবহার করে আপনার গেমটি ব্যাকগ্রাউন্ডে চলছে কিনা তা মনিটর করুন।

অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (এপিআই)

অ্যান্ড্রয়েড এমন সিস্টেম এপিআই (API) প্রদান করে, যা আপনার গেমকে মেমরির চাপের প্রতি গতিশীলভাবে সাড়া দিতে এবং রানটাইমে মেমরির বিস্তারিত তথ্য সংগ্রহ করতে সক্ষম করে।

মেমরি ট্রিম ইভেন্টগুলিতে সাড়া দিন

সিস্টেমটি onTrimMemory ব্যবহার করে আপনার অ্যাপকে এমন লাইফসাইকেল ইভেন্টগুলো সম্পর্কে অবহিত করে, যা আপনার অ্যাপকে স্বেচ্ছায় তার মেমরি ব্যবহার কমাতে এবং অন্যান্য অ্যাপের ব্যবহারের জন্য মেমরি খালি করতে লো-মেমরি কিলার (LMK) দ্বারা বন্ধ হয়ে যাওয়া এড়ানোর একটি ভালো সুযোগ দেয়।

সিস্টেম যদি ব্যাকগ্রাউন্ডে আপনার অ্যাপটি বন্ধ করে দেয়, তাহলে পুনরায় চালু করার সময় ব্যবহারকারীকে একটি ধীরগতির কোল্ড স্টার্টের সম্মুখীন হতে হয়। ব্যাকগ্রাউন্ডে মেমরির ব্যবহার কমালে এই ধরনের ব্যাকগ্রাউন্ড টার্মিনেশন প্রতিরোধ করা সম্ভব হয়।

ট্রিম ইভেন্টের প্রতিক্রিয়া জানানোর সময়, বড় এবং পুনর্গঠনযোগ্য মেমরি অ্যালোকেশনগুলো মুক্ত করুন যেগুলো তাৎক্ষণিকভাবে প্রয়োজন নেই:

  • উদাহরণ: TRIM_MEMORY_UI_HIDDEN এর প্রতিক্রিয়ায় ক্যাশ করা বিটম্যাপ (স্থানীয় স্টোরেজ থেকে ডিকোড করা) ছাঁটাই বা মুছে ফেলা।

কোটলিন

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {
    override fun onTrimMemory(level: Int) {
        if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            // Release memory related to UI elements, such as bitmap caches.
        }
        if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
            // Release memory related to background processing, such as by
            // closing a database connection.
        }
    }
}

জাভা

public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 {
    public void onTrimMemory(int level) {
        switch (level) {
            if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
                // Release memory related to UI elements, such as bitmap caches.
            }
            if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
                // Release memory related to background processing, such as by
                // closing a database connection.
            }
        }
    }
}

ProfilingManager

অ্যান্ড্রয়েড ১৫ (এপিআই লেভেল ৩৫)-এ প্রবর্তিত ProfilingManager API, অ্যাপ্লিকেশনগুলোকে সরাসরি রানটাইমে প্রোগ্রামগতভাবে সংজ্ঞায়িত স্ন্যাপশট (যেমন হিপ প্রোফাইল, সিস্টেম ট্রেস এবং জাভা হিপ ডাম্প) ক্যাপচার করার সুযোগ দেয়।

ডেভেলপাররা নির্দিষ্ট দৃশ্যে ম্যানুয়ালি ক্যাপচার ট্রিগার করতে পারেন, অথবা গেম প্রসেস মেমরি লিমিটারের সীমা লঙ্ঘন করলে স্বয়ংক্রিয়ভাবে ক্যাপচার চালু করার জন্য TRIGGER_TYPE_ANOMALY এর মতো স্বয়ংক্রিয় ট্রিগার রেজিস্টার করতে পারেন। তবে, গেম ডেভেলপারদের অবশ্যই আধুনিক গেম ইঞ্জিনের কিছু গুরুত্বপূর্ণ সীমাবদ্ধতা বিবেচনায় রাখতে হবে:

দ্রষ্টব্য: আধুনিক গেম ইঞ্জিনগুলো (যেমন ইউনিটি বা আনরিয়েল) mmap-এর MAP_ANONYMOUS ফ্ল্যাগ ব্যবহার করে কার্নেল থেকে বিশাল ভার্চুয়াল মেমরি ব্লক আগে থেকেই বরাদ্দ করার মাধ্যমে এক্সিকিউশন পারফরম্যান্স পরিচালনা করে। এরপর ইঞ্জিনগুলো অভ্যন্তরীণভাবে মেমরি ব্লকগুলোকে উপবিভক্ত ও বরাদ্দ করার জন্য কাস্টম সাব-অ্যালোকেটর (উদাহরণস্বরূপ, ইউনিটির নেটিভ মেমরি ম্যানেজার বা আনরিয়েলের BinnedAllocators) ব্যবহার করে।

অ্যাপ্লিকেশন প্রস্থান তথ্য

যদি আপনার গেমটি ব্যাকগ্রাউন্ডে বন্ধ হয়ে যায় অথবা কোনো নির্দিষ্ট প্রসেসের মেমরি সীমা লঙ্ঘনের কারণে কিল হয়ে যায়, তবে স্ট্যান্ডার্ড জাভা বা নেটিভ ক্র্যাশ ডাম্প মেকানিজম (যেমন ফায়ারবেস ক্র্যাশলিটিক্স) সেই ইভেন্টটি রেজিস্টার করে না। প্রোগ্রাম্যাটিকভাবে এই টার্মিনেশনগুলো কোয়েরি ও লগ করার জন্য, ডেভেলপারদের গেম চালুর সময় ApplicationExitInfo API ব্যবহার করা উচিত।

  • বাস্তবায়ন: শুরুতে, সাম্প্রতিক সেশনগুলোর প্রস্থানের কারণগুলো সংগ্রহ করতে ActivityManager.getHistoricalProcessExitReasons() কল করুন।
  • মেমরি থেকে বেরিয়ে যাওয়ার প্রধান কারণসমূহ:
    • REASON_LOW_MEMORY : এটি নির্দেশ করে যে প্রসেসটি সিস্টেমের লো মেমোরি কিলার (LMK) দ্বারা বন্ধ করে দেওয়া হয়েছে। এই বন্ধ হওয়ার ঘটনাটি ঘটে যখন ডিভাইস-ব্যাপী মেমোরির চাপ বেশি থাকে এবং অপারেটিং সিস্টেমকে র‍্যাম পুনরুদ্ধার করতে হয়। এই প্রস্থানের কারণটি নির্দেশ করে যে আপনার গেমের ব্যাকগ্রাউন্ড ফুটপ্রিন্ট এতটাই বড় যে এটি অন্যান্য অ্যাপ্লিকেশনের সাথে সহাবস্থান করতে পারে না।
    • REASON_MEMORY_LIMITER (অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) এবং উচ্চতর): এটি নির্দেশ করে যে প্রসেসটিকে বিশেষভাবে বন্ধ করে দেওয়া হয়েছে কারণ এটি প্ল্যাটফর্মের মেমরি লিমিটার দ্বারা নির্ধারিত তার সি-গ্রুপ মেমরি লিমিট (RssAnon + VmSwap) অতিক্রম করেছিল। ডিভাইসে পর্যাপ্ত ফিজিক্যাল মেমরি অবশিষ্ট থাকলেও এই টার্মিনেশন ঘটতে পারে, যা স্বতন্ত্র প্রসেসের লিমিটের সরাসরি লঙ্ঘন নির্দেশ করে।

উপলব্ধ সরঞ্জাম ব্যবহার করুন

ডেভেলপমেন্ট এবং QA চলাকালীন আপনার গেমের মেমরি ব্যবহার সঠিকভাবে পরিমাপ করতে নিম্নলিখিত প্ল্যাটফর্ম টুলগুলি ব্যবহার করুন।

meminfo

এই টুলটি মেমরি পরিসংখ্যান সংগ্রহ করে দেখায় যে কী পরিমাণ PSS মেমরি বরাদ্দ করা হয়েছিল এবং কোন কোন বিভাগের জন্য তা ব্যবহৃত হয়েছিল।

নিম্নলিখিত উপায়গুলির মধ্যে যেকোনো একটিতে meminfo পরিসংখ্যান প্রিন্ট করুন:

  • adb shell dumpsys meminfo package-name কমান্ডটি ব্যবহার করুন।
  • অ্যান্ড্রয়েড ডিবাগ এপিআই থেকে MemoryInfo কলটি ব্যবহার করুন।

PrivateDirty স্ট্যাটিস্টিকটি প্রসেসের ভেতরের সেই পরিমাণ র‍্যাম দেখায়, যা ডিস্কে পেজ করা যায় না এবং অন্য কোনো প্রসেসের সাথে শেয়ার করা হয় না। যখন সেই প্রসেসটি কিল করা হয়, তখন এই পরিমাণের সিংহভাগ সিস্টেমের জন্য উপলব্ধ হয়।

মেমরি ট্রেসপয়েন্ট

মেমোরি ট্রেসপয়েন্ট আপনার গেম কী পরিমাণ আরএসএস (RSS) মেমোরি ব্যবহার করছে তা ট্র্যাক করে। পিএসএস (PSS) মেমোরি ব্যবহারের হিসাব করার চেয়ে আরএসএস (RSS) মেমোরি ব্যবহারের হিসাব করা অনেক দ্রুততর। যেহেতু এর হিসাব দ্রুততর, তাই আরএসএস (RSS) মেমোরির আকারের পরিবর্তনে আরও সূক্ষ্ম বিবরণ দেখায়, যা সর্বোচ্চ মেমোরি ব্যবহারের আরও সঠিক পরিমাপ প্রদান করে। ফলে, ব্যবহারের এমন সর্বোচ্চ পর্যায়গুলো সহজে শনাক্ত করা যায়, যা গেমের মেমোরি শেষ হয়ে যাওয়ার কারণ হতে পারে।

পারফেট্টো

পারফেটটো হলো একটি ডিভাইসের পারফরম্যান্স ও মেমরি সংক্রান্ত তথ্য সংগ্রহ করে তা একটি ওয়েব-ভিত্তিক UI-তে প্রদর্শন করার জন্য একটি টুলস স্যুট। এটি ইচ্ছামতো দীর্ঘ ট্রেস সমর্থন করে, ফলে আপনি সময়ের সাথে সাথে RSS কীভাবে পরিবর্তিত হয় তা দেখতে পারেন। অফলাইন প্রক্রিয়াকরণের জন্য এর উৎপাদিত ডেটার উপর আপনি SQL কোয়েরিও চালাতে পারেন। সিস্টেম ট্রেসিং অ্যাপ থেকে দীর্ঘ ট্রেস সক্রিয় করুন। নিশ্চিত করুন যে ট্রেসটির জন্য memory:Memory ক্যাটাগরিটি সক্রিয় করা আছে। ডেভেলপমেন্ট এবং টেস্টিং-এ কাস্টম মেমরি ইন্সট্রুমেন্টেশনের জন্য, আপনি (বিটা) heapprofd API- ও ব্যবহার করতে পারেন।

RssAnon-কে তদন্ত করুন এবং এর পরিবর্তে Perfetto-কে অন্তর্ভুক্ত করুন।

আপনার গেমের অ্যানোনিমাস মেমরি এবং zRAM সোয়াপের প্রভাব পরীক্ষা করতে, ui.perfetto.dev- এ অবস্থিত ওয়েব-ভিত্তিক UI-তে আপনার ট্রেস ফাইলটি লোড করুন এবং ডিপ মেমরি কেস-স্টাডির জন্য ডিজাইন করা এই বিশ্লেষণমূলক কৌশলগুলি অনুসরণ করুন (আরও বিস্তারিত জানার জন্য পারফেটটো মেমরি অ্যানালাইসিস কেস স্টাডিজ দেখুন):

১. টাইমলাইনে মেমরি কাউন্টারগুলো দৃশ্যমান করা

  • আপনার প্রসেসটি খুঁজুন: নেভিগেশন তালিকায়, আপনার গেমের প্যাকেজ বা প্রসেসের নামটি দিয়ে অনুসন্ধান করুন।
  • ট্র্যাক গ্রুপ প্রসারিত করুন: আপনার প্রসেস রো-তে ক্লিক করে এর থ্রেড ট্র্যাকগুলো প্রসারিত করুন এবং মেমরি (Memory) নামের সাব-গ্রুপটি খুঁজুন।
  • ট্র্যাকগুলো বিশ্লেষণ করুন:
    • mem.rss.anon (অ্যানোনিমাস আরএসএস) : এই লাইন গ্রাফটি আপনার গেমের আনম্যানেজড মেমোরি পুলগুলো দ্বারা রিয়েল-টাইমে ব্যবহৃত ফিজিক্যাল র‍্যাম দেখায়। উচ্চ অ্যালোকেশন পিকগুলো পরীক্ষা করার জন্য সিন লোড, UI পপআপ বা গেমপ্লে ট্রানজিশনের সময় এই টাইমলাইনটি মনিটর করুন।
    • mem.swap (কম্প্রেসড সোয়াপ বা VmSwap) : এই গ্রাফটি zRAM-এ স্থানান্তরিত মেমরি ব্লকগুলির প্রি-কম্প্রেসড আকার দেখায়। গেমপ্লে চলাকালীন উচ্চ সোয়াপ অ্যাক্টিভিটি নির্দেশ করে যে আপনার গেমটি একটি সীমিত মেমরি ডিভাইসে চলছে এবং সিস্টেমটি সক্রিয়ভাবে ব্যাকগ্রাউন্ড অ্যাসেটগুলিকে কম্প্রেস করছে।

২. SQL কোয়েরি চালানো (ট্রেস প্রসেসর) বিস্তারিত অফলাইন বিশ্লেষণের জন্য, আপনি সরাসরি পারফেটটো UI কনসোলের ভিতরে SQL কোয়েরি চালাতে পারেন অথবা পরিসংখ্যানগত শীর্ষবিন্দু গণনা করতে স্বতন্ত্র ট্রেস প্রসেসর পাইথন লাইব্রেরি ব্যবহার করতে পারেন।

  • সর্বোচ্চ বেনামী আরএসএস বরাদ্দ খুঁজুন:

    SELECT
      max(value) / 1024 / 1024 AS max_rss_anon_mb
    FROM counter
    JOIN counter_track ON counter.track_id = counter_track.id
    WHERE counter_track.name = 'mem.rss.anon'
      AND counter_track.upid IN (
        SELECT upid FROM process WHERE name = 'your.game.package.name'
      );
    
  • যেকোনো নির্দিষ্ট টাইমস্ট্যাম্পে RssAnon এবং VmSwap-এর মধ্যে সম্পর্ক স্থাপন করুন:

    SELECT
      ts,
      track.name AS metric_type,
      value / 1024 / 1024 AS size_mb
    FROM counter
    JOIN counter_track track ON counter.track_id = track.id
    WHERE (track.name = 'mem.rss.anon' OR track.name = 'mem.swap')
      AND track.upid IN (
        SELECT upid FROM process WHERE name = 'your.game.package.name'
      )
    ORDER BY ts ASC;
    

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে ট্রেস ফাইল পরিদর্শন করার বিষয়ে আরও বিস্তারিত জানতে, "সিস্টেম ট্রেস পরিদর্শন করুন: প্রসেস মেমরি (RSS)" দেখুন। মেমরি প্রোফাইল স্ক্রিপ্টিং করার বিষয়ে বিস্তারিত জানতে, "নেটিভ অ্যালোকেশন রেকর্ড করুন" দেখুন।

হিপপ্রোফড

heapprofd হলো Perfetto-এর একটি অংশ, যা একটি মেমরি ট্র্যাকিং টুল। এই টুলটি malloc ব্যবহার করে কোথায় মেমরি বরাদ্দ করা হয়েছিল তা দেখিয়ে মেমরি লিক খুঁজে পেতে সাহায্য করতে পারে। heapprofd একটি পাইথন স্ক্রিপ্ট ব্যবহার করে চালু করা যায়, এবং যেহেতু এই টুলটির ওভারহেড কম, তাই এটি Malloc Debug-এর মতো অন্যান্য টুলের মতো পারফরম্যান্সকে প্রভাবিত করে না।

বাগরিপোর্ট

bugreport হলো একটি লগিং টুল, যা দিয়ে জানা যায় আপনার গেমটি মেমোরি শেষ হয়ে যাওয়ার কারণে ক্র্যাশ করেছে কি না। এই টুলের আউটপুট logcat ব্যবহারের চেয়ে অনেক বেশি বিস্তারিত। এটি মেমোরি ডিবাগিংয়ের জন্য উপযোগী, কারণ এর মাধ্যমে দেখা যায় আপনার গেমটি মেমোরি শেষ হয়ে যাওয়ার কারণে ক্র্যাশ করেছে, নাকি LMK (লিকুইড কিবোর্ড) দ্বারা বন্ধ করে দেওয়া হয়েছে।

আরও তথ্যের জন্য, বাগ রিপোর্ট সংগ্রহ ও পাঠ দেখুন।

গেম ইঞ্জিন টুলস

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

ঐক্য

ইউনিটি ইঞ্জিন পরিবেশে, আপনি ইউনিটির নেটিভ প্রোফাইলিং টুল এবং ক্লাস ব্যবহার করে রানটাইমে অত্যন্ত নির্ভরযোগ্যতার সাথে অ্যান্ড্রয়েড অ্যানোনিমাস আরএসএস + সোয়াপ মেমরি ফুটপ্রিন্ট নির্ভুলভাবে অনুমান করতে পারেন (যা সাধারণত প্রকৃত ওএস-স্তরের মানের তুলনায় ১০%-এর কম তারতম্য দেখায়)।

কনফিগারেশন নিয়মাবলী এবং রানটাইম স্ক্রিপ্ট সহ একটি সম্পূর্ণ ধাপে ধাপে টিউটোরিয়ালের জন্য, “ইউনিটি টুলস দিয়ে মেমরি কীভাবে পরীক্ষা করবেন” দেখুন।

  • ইউনিটি প্রোফাইলার এপিআই : আপনি কোর ইঞ্জিন মেট্রিক্স কোয়েরি করার মাধ্যমে রানটাইমে প্রোগ্রাম্যাটিকভাবে আপনার গেমের আনম্যানেজড মেমোরি ফুটপ্রিন্ট অনুমান করতে পারেন:
    • Profiler ক্লাস ব্যবহার করে : Profiler.GetTotalReservedMemoryLong() এবং Profiler.GetMonoHeapSizeLong() -এর মানগুলো যোগ করে মোট মেমরি বরাদ্দের হিসাব রাখুন।
    • ProfilerRecorder ক্লাস ব্যবহার করে : মেমরি ক্যাটাগরিগুলো গতিশীলভাবে মনিটর করুন। একটি নির্ভরযোগ্য বেসলাইন আনুমানিক মান প্রতিষ্ঠা করতে, ফাইল-ব্যাকড গ্রাফিক্স মেমরি উপাদানগুলো বাদ দেওয়ার জন্য Total Reserved Memory (রিলিজ বিল্ডে) সংগ্রহ করুন অথবা তা থেকে Gfx Reserved Memory (ডেভেলপমেন্ট বিল্ডে) বিয়োগ করুন।
  • ইউনিটি মেমোরি প্রোফাইলার : অফলাইনে মেমোরি লিক শনাক্ত ও ডিবাগ করতে, একটি মেমোরি স্ন্যাপশট নিন এবং 'অল অফ মেমোরি' বিভাগের অধীনে থাকা 'রেসিডেন্ট মেমোরি অন ডিভাইস' চার্টটি পরীক্ষা করুন। আনুমানিক ফুটপ্রিন্ট গণনা করতে, নিম্নলিখিত বিভাগগুলির মোট পরিমাণ যোগ করুন: আনট্র্যাকড, অ্যান্ড্রয়েড রানটাইম, নেটিভ এবং ম্যানেজড।
    • zRAM সীমাবদ্ধতা : মেমোরির স্বল্পতার পরিস্থিতিতে, অ্যান্ড্রয়েড কার্নেল নিষ্ক্রিয় মেমোরি পেজগুলোকে সংকুচিত করে সোয়াপ স্পেসে (zRAM) রাখতে পারে। যেহেতু ইউনিটি মেমোরি প্রোফাইলার OS-স্তরের সোয়াপ প্যারামিটার শনাক্ত করতে পারে না, তাই মেমোরি-নির্ভর দৃশ্যগুলোতে আপনি মেমোরি ফুটপ্রিন্টে সামান্য গরমিল দেখতে পারেন। সঠিক মান নিশ্চিত করতে আপনার অনুমানগুলোকে পারফেটোর সাথে মিলিয়ে নিন।