গেমগুলিতে মেমরি কার্যকরভাবে পরিচালনা করুন

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

এই পৃষ্ঠাটি আপনার গেমকে প্রভাবিত করে এমন কম মেমরির অবস্থা এড়াতে আপনি যে পদক্ষেপগুলি নিতে পারেন তা ব্যাখ্যা করে।

onTrimMemory() কে উত্তর দিন

সিস্টেমটি ব্যবহার করে 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.
            }
        }
    }
}

সি#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

class LowMemoryTrigger : MonoBehaviour
{
    private void Start()
    {
        Application.lowMemory += OnLowMemory;
    }
    private void OnLowMemory()
    {
        // Respond to low memory condition (e.g., Resources.UnloadUnusedAssets())
    }
}

মেমরি অ্যাডভাইস API বিটা ব্যবহার করুন

মেমরি অ্যাডভাইস এপিআইটি onTrimMemory-এর বিকল্প হিসাবে তৈরি করা হয়েছিল যাতে আসন্ন LMK-এর ভবিষ্যদ্বাণী করার ক্ষেত্রে অনেক বেশি স্মরণ এবং নির্ভুলতা রয়েছে। API ব্যবহার করা মেমরি সম্পদের পরিমাণ অনুমান করে এবং তারপর নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করা হলে অ্যাপটিকে অবহিত করে এটি অর্জন করে। API আপনার অ্যাপে সরাসরি মেমরি ব্যবহারের আনুমানিক শতাংশ রিপোর্ট করতে পারে। আপনি মেমরি পরিচালনার উদ্দেশ্যে onTrimMemory ইভেন্টের বিকল্প হিসাবে মেমরি অ্যাডভাইস API ব্যবহার করতে পারেন।

মেমরি অ্যাডভাইস API ব্যবহার করতে শুরু করার নির্দেশিকা ব্যবহার করুন।

মেমরি বাজেটের সাথে রক্ষণশীল হন

মেমরি ফুরিয়ে এড়াতে রক্ষণশীলভাবে বাজেট মেমরি। বিবেচনা করার জন্য কিছু আইটেম নিম্নলিখিত অন্তর্ভুক্ত:

  • ভৌত র‍্যামের আকার : গেমগুলি প্রায়শই ডিভাইসে শারীরিক RAM পরিমাণের ¼ এবং ½ এর মধ্যে ব্যবহার করে৷
  • সর্বাধিক zRAM আকার : আরও zRAM মানে গেমটিতে বরাদ্দ করার জন্য সম্ভাব্য আরও মেমরি রয়েছে। এই পরিমাণ ডিভাইসের উপর ভিত্তি করে পরিবর্তিত হতে পারে; এই মানটি খুঁজে পেতে /proc/meminfoSwapTotal সন্ধান করুন।
  • OS-এর মেমরি ব্যবহার : যে ডিভাইসগুলি সিস্টেম প্রসেসে বেশি RAM নির্ধারণ করে সেগুলি আপনার গেমের জন্য কম মেমরি রেখে যায়। সিস্টেম প্রসেস মেরে ফেলার আগে সিস্টেমটি আপনার গেমের প্রক্রিয়াটিকে মেরে ফেলে।
  • ইনস্টল করা অ্যাপের মেমরি ব্যবহার : অনেক অ্যাপ ইনস্টল করা আছে এমন ডিভাইসে আপনার গেমটি পরীক্ষা করুন। সোশ্যাল মিডিয়া এবং চ্যাট অ্যাপগুলিকে ক্রমাগত চলতে হবে এবং বিনামূল্যে মেমরির পরিমাণকে প্রভাবিত করতে হবে।

আপনি যদি রক্ষণশীল মেমরি বাজেটে প্রতিশ্রুতিবদ্ধ না হন তবে আরও নমনীয় পদ্ধতি গ্রহণ করুন। যদি সিস্টেমটি কম মেমরির সমস্যায় চলে যায় তবে গেমটি যে মেমরি ব্যবহার করছে তার পরিমাণ কমিয়ে দিন। উদাহরণস্বরূপ, নিম্ন-রেজোলিউশনের টেক্সচারগুলি বরাদ্দ করুন বা onTrimMemory() এর প্রতিক্রিয়া হিসাবে কম শেডার সংরক্ষণ করুন৷ মেমরি বরাদ্দের এই গতিশীল পদ্ধতির জন্য ডেভেলপারের কাছ থেকে আরও বেশি কাজ করা প্রয়োজন, বিশেষ করে গেম ডিজাইনের পর্যায়ে।

মারধর এড়িয়ে চলুন

থ্র্যাশিং ঘটে যখন ফ্রি মেমরি কম থাকে, কিন্তু গেমটি মারার জন্য যথেষ্ট কম হয় না। এই পরিস্থিতিতে, kswapd সেই পৃষ্ঠাগুলি পুনরুদ্ধার করেছে যা গেমটির এখনও প্রয়োজন, তাই এটি মেমরি থেকে পৃষ্ঠাগুলি পুনরায় লোড করার চেষ্টা করে। সেখানে পর্যাপ্ত স্থান নেই, তাই পৃষ্ঠাগুলি অদলবদল হতে থাকে (নিরবচ্ছিন্ন অদলবদল)। সিস্টেম ট্রেসিং এই পরিস্থিতিকে একটি থ্রেড হিসাবে রিপোর্ট করে যেখানে kswapd ক্রমাগত চলে।

থ্র্যাশিংয়ের একটি লক্ষণ হল দীর্ঘ ফ্রেমের সময় - সম্ভবত এক সেকেন্ড বা তার বেশি। এই পরিস্থিতি সমাধানের জন্য গেমের মেমরি পদচিহ্ন হ্রাস করুন।

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

সিস্টেম কীভাবে মেমরি পরিচালনা করে তা বুঝতে সহায়তা করার জন্য Android এর একটি সংগ্রহ রয়েছে।

মেমিনফো

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

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

  • adb shell dumpsys meminfo package-name কমান্ডটি ব্যবহার করুন।
  • Android Debug API থেকে MemoryInfo কল ব্যবহার করুন।

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

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

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

Perfetto এবং দীর্ঘ ট্রেস

Perfetto হল একটি ডিভাইসে কর্মক্ষমতা এবং মেমরির তথ্য সংগ্রহ করার জন্য এবং ওয়েব-ভিত্তিক UI-তে প্রদর্শনের জন্য টুলগুলির একটি স্যুট। এটি নির্বিচারে দীর্ঘ ট্রেস সমর্থন করে যাতে আপনি দেখতে পারেন কিভাবে RSS সময়ের সাথে পরিবর্তিত হয়। আপনি অফলাইন প্রক্রিয়াকরণের জন্য এটি তৈরি করা ডেটাতে SQL প্রশ্নও ইস্যু করতে পারেন। সিস্টেম ট্রেসিং অ্যাপ থেকে দীর্ঘ ট্রেস সক্ষম করুন৷ নিশ্চিত করুন মেমরি:মেমরি বিভাগ ট্রেস জন্য সক্রিয় করা হয়েছে.

heapprofd

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

বাগ রিপোর্ট

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

আরও তথ্যের জন্য, ক্যাপচার দেখুন এবং বাগ রিপোর্ট পড়ুন