অ্যান্ড্রয়েড প্ল্যাটফর্মে, সিস্টেম যথাসম্ভব বেশি সিস্টেম মেমরি (র্যাম) ব্যবহার করার চেষ্টা করে এবং প্রয়োজনে জায়গা খালি করার জন্য বিভিন্ন মেমরি অপটিমাইজেশন করে থাকে। এই অপটিমাইজেশনগুলো আপনার গেমের উপর নেতিবাচক প্রভাব ফেলতে পারে, হয় সেটিকে ধীর করে দিয়ে অথবা পুরোপুরি বন্ধ করে দিয়ে। আপনি ‘প্রসেসগুলোর মধ্যে মেমরি বরাদ্দ’ (Memory allocation among processes) নামক টপিকে এই অপটিমাইজেশনগুলো সম্পর্কে আরও জানতে পারবেন।
এই পৃষ্ঠায় সেই পদক্ষেপগুলো ব্যাখ্যা করা হয়েছে, যা অনুসরণ করে আপনি মেমোরি স্বল্পতার কারণে আপনার গেমে প্রভাব পড়া এড়াতে পারেন।
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. } } } }
মেমরি বাজেটের ক্ষেত্রে রক্ষণশীল হোন।
মেমোরি শেষ হয়ে যাওয়া এড়াতে মেমোরির জন্য মিতব্যয়ী বাজেট করুন। বিবেচ্য বিষয়গুলো নিচে দেওয়া হলো:
- ফিজিক্যাল র্যামের পরিমাণ : গেমগুলো প্রায়শই ডিভাইসের ফিজিক্যাল র্যামের এক-চতুর্থাংশ থেকে অর্ধেক পরিমাণ ব্যবহার করে।
- সর্বোচ্চ zRAM সাইজ : বেশি zRAM মানে হলো গেমটির বরাদ্দ করার জন্য সম্ভাব্য আরও বেশি মেমরি রয়েছে। এই পরিমাণ ডিভাইস অনুযায়ী পরিবর্তিত হতে পারে; এই মানটি জানতে
/proc/meminfoতেSwapTotalদেখুন। - অপারেটিং সিস্টেমের মেমরি ব্যবহার : যে ডিভাইসগুলো সিস্টেম প্রসেসের জন্য বেশি র্যাম বরাদ্দ করে, সেগুলো আপনার গেমের জন্য কম মেমরি রাখে। সিস্টেম অন্যান্য সিস্টেম প্রসেস বন্ধ করার আগে আপনার গেমের প্রসেসটি বন্ধ করে দেয়।
- ইনস্টল করা অ্যাপগুলির মেমরি ব্যবহার : যেসব ডিভাইসে অনেক অ্যাপ ইনস্টল করা আছে, সেগুলিতে আপনার গেমটি পরীক্ষা করুন। সোশ্যাল মিডিয়া এবং চ্যাট অ্যাপগুলিকে ক্রমাগত চলতে হয় এবং এগুলি খালি মেমরির পরিমাণকে প্রভাবিত করে।
যদি আপনি একটি রক্ষণশীল মেমোরি বাজেট মেনে চলতে না পারেন, তবে আরও নমনীয় পদ্ধতি অবলম্বন করুন। যদি সিস্টেমে মেমোরি কম থাকার সমস্যা দেখা দেয়, তবে গেমটি যে পরিমাণ মেমোরি ব্যবহার করছে তা কমিয়ে দিন। উদাহরণস্বরূপ, onTrimMemory() এর প্রতিক্রিয়ায় কম রেজোলিউশনের টেক্সচার বরাদ্দ করুন অথবা কম শেডার সংরক্ষণ করুন। মেমোরি বরাদ্দের এই গতিশীল পদ্ধতির জন্য ডেভেলপারের পক্ষ থেকে আরও বেশি পরিশ্রমের প্রয়োজন হয়, বিশেষ করে গেম ডিজাইন পর্যায়ে।
মারধর করা এড়িয়ে চলুন
যখন ফ্রি মেমোরিতে জায়গা কম থাকে, কিন্তু গেমটি বন্ধ হয়ে যাওয়ার মতো যথেষ্ট কম নয়, তখন থ্র্যাশিং ঘটে। এই পরিস্থিতিতে, kswapd এমন কিছু পেজ পুনরুদ্ধার করে রাখে যা গেমটির তখনও প্রয়োজন, তাই এটি মেমোরি থেকে পেজগুলো পুনরায় লোড করার চেষ্টা করে। পর্যাপ্ত জায়গা না থাকায় পেজগুলো ক্রমাগত সোয়াপ আউট হতে থাকে (অবিরাম সোয়াপিং)। সিস্টেম ট্রেসিং এই পরিস্থিতিকে একটি থ্রেড হিসেবে রিপোর্ট করে, যেখানে kswapd অবিরাম চলতে থাকে।
থ্র্যাশিং-এর একটি লক্ষণ হলো দীর্ঘ ফ্রেম টাইম—যা এক সেকেন্ড বা তারও বেশি হতে পারে। এই পরিস্থিতি সমাধান করতে গেমটির মেমোরি ফুটপ্রিন্ট হ্রাস করুন।
উপলব্ধ সরঞ্জাম ব্যবহার করুন
সিস্টেম কীভাবে মেমরি পরিচালনা করে, তা বুঝতে সাহায্য করার জন্য অ্যান্ড্রয়েডে বিভিন্ন টুল রয়েছে।
মেমিনফো
এই টুলটি মেমরি পরিসংখ্যান সংগ্রহ করে দেখায় যে কী পরিমাণ PSS মেমরি বরাদ্দ করা হয়েছিল এবং কোন কোন বিভাগের জন্য তা ব্যবহৃত হয়েছিল।
নিম্নলিখিত উপায়গুলির মধ্যে যেকোনো একটিতে meminfo পরিসংখ্যান প্রিন্ট করুন:
-
adb shell dumpsys meminfo package-nameকমান্ডটি ব্যবহার করুন। - অ্যান্ড্রয়েড ডিবাগ এপিআই থেকে
MemoryInfoকলটি ব্যবহার করুন।
PrivateDirty স্ট্যাটিস্টিকটি কোনো প্রসেসের ভেতরের সেই পরিমাণ র্যাম দেখায়, যা ডিস্কে পেজ করা যায় না এবং অন্য কোনো প্রসেসের সাথে শেয়ার করা হয় না। যখন সেই প্রসেসটি কিল করা হয়, তখন এই পরিমাণের সিংহভাগ সিস্টেমের জন্য উপলব্ধ হয়।
মেমরি ট্রেসপয়েন্ট
মেমোরি ট্রেসপয়েন্ট আপনার গেম কী পরিমাণ আরএসএস (RSS) মেমোরি ব্যবহার করছে তা ট্র্যাক করে। পিএসএস (PSS) মেমোরি ব্যবহারের হিসাব করার চেয়ে আরএসএস মেমোরি ব্যবহারের হিসাব করা অনেক দ্রুততর। যেহেতু এর হিসাব দ্রুততর, তাই আরএসএস মেমোরির আকারের পরিবর্তনে আরও সূক্ষ্ম বিবরণ দেখায়, যা সর্বোচ্চ মেমোরি ব্যবহারের আরও সঠিক পরিমাপ প্রদান করে। ফলে, ব্যবহারের এমন সর্বোচ্চ পর্যায়গুলো সহজে শনাক্ত করা যায়, যা গেমের মেমোরি শেষ হয়ে যাওয়ার কারণ হতে পারে।
পারফেট্টো এবং দীর্ঘ চিহ্ন
পারফেটটো হলো একটি ডিভাইসের পারফরম্যান্স ও মেমরি সংক্রান্ত তথ্য সংগ্রহ করে একটি ওয়েব-ভিত্তিক UI-তে প্রদর্শন করার জন্য টুলসের একটি স্যুট। এটি ইচ্ছামতো দীর্ঘ ট্রেস সমর্থন করে, যার ফলে আপনি সময়ের সাথে সাথে RSS কীভাবে পরিবর্তিত হয় তা দেখতে পারেন। অফলাইন প্রক্রিয়াকরণের জন্য আপনি এর উৎপাদিত ডেটার উপর SQL কোয়েরিও চালাতে পারেন। সিস্টেম ট্রেসিং অ্যাপ থেকে দীর্ঘ ট্রেস সক্রিয় করুন। নিশ্চিত করুন যে ট্রেসটির জন্য memory:Memory ক্যাটাগরিটি সক্রিয় করা আছে। ডেভেলপমেন্ট এবং টেস্টিং-এ কাস্টম মেমরি ইন্সট্রুমেন্টেশনের জন্য, আপনি (বিটা) heapprofd API- ও ব্যবহার করতে পারেন।
হিপপ্রোফড
heapprofd হলো Perfetto-এর একটি অংশ, যা একটি মেমরি ট্র্যাকিং টুল। এই টুলটি malloc ব্যবহার করে কোথায় মেমরি বরাদ্দ করা হয়েছিল তা দেখিয়ে মেমরি লিক খুঁজে পেতে সাহায্য করতে পারে। heapprofd একটি পাইথন স্ক্রিপ্ট ব্যবহার করে চালু করা যায়, এবং যেহেতু এই টুলটির ওভারহেড কম, তাই এটি Malloc Debug-এর মতো অন্যান্য টুলের মতো পারফরম্যান্সকে প্রভাবিত করে না।
বাগরিপোর্ট
bugreport হলো একটি লগিং টুল, যা দিয়ে জানা যায় আপনার গেমটি মেমোরি শেষ হয়ে যাওয়ার কারণে ক্র্যাশ করেছে কি না। এই টুলের আউটপুট logcat ব্যবহারের চেয়ে অনেক বেশি বিস্তারিত। এটি মেমোরি ডিবাগিংয়ের জন্য উপযোগী, কারণ এর মাধ্যমে দেখা যায় আপনার গেমটি মেমোরি শেষ হয়ে যাওয়ার কারণে ক্র্যাশ করেছে, নাকি LMK (লিকুইড কিবোর্ড) দ্বারা বন্ধ করে দেওয়া হয়েছে।
আরও তথ্যের জন্য, বাগ রিপোর্ট সংগ্রহ ও পাঠ দেখুন।