অ্যান্ড্রয়েডে আনরিয়েল গেম মেমরি অপ্টিমাইজেশন

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

শেডার পারমুটেশন রিডাকশনের মাধ্যমে মেমরি সাশ্রয়

Lighting বা Mobile Shader Permutation Reduction এ অব্যবহৃত অপশনগুলো অপসারণ করার মাধ্যমে, আপনি শেডার পারমুটেশনের সংখ্যা কমিয়ে আনতে পারেন। এটি অ্যাপ প্যাকেজিং সাইজ উল্লেখযোগ্যভাবে হ্রাস করে, পাইপলাইন স্টেট অবজেক্টের (PSO) সংখ্যা কমায় এবং অব্যবহৃত রেন্ডার টার্গেট বা ডামি টেক্সচার তৈরি হওয়া প্রতিরোধ করে, যার ফলে রানটাইম মেমরি কমে এবং পারফরম্যান্স উন্নত হয়।

আরও তথ্যের জন্য, “মোবাইল ডিভাইসের জন্য পারফরম্যান্স নির্দেশিকা” -এর “মোবাইলের জন্য বিবিধ লাইটিং এবং শেডার পারমুটেশন রিডাকশন সেটিংস” বিভাগটি দেখুন।

সম্পদ লোডিং অপ্টিমাইজেশন

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

  • C++ কোড সংজ্ঞা ও ডেটা পৃথকীকরণ : C++ কোডে UCLASS(Abstract) ব্যবহার করে মূল কার্যকারিতাগুলোকে প্রকৃত ডেটা থেকে পৃথক করে সংজ্ঞায়িত করুন।
  • ইনহেরিটেন্স হ্রাস করুন : ডেটা সেটআপ এবং অ্যাসেট লোডিং শুধুমাত্র লিফ-নোড ব্লুপ্রিন্টে সম্পাদন করুন।
  • পরোক্ষ রেফারেন্স ব্যবহার করুন : হার্ড রেফারেন্স এড়াতে TSoftObjectPtr ব্যবহার করে পরোক্ষ প্রপার্টি রেফারেন্স প্রয়োগ করুন, এবং রানটাইমে শুধুমাত্র প্রয়োজনের সময় অ্যাসিঙ্ক্রোনাসভাবে অ্যাসেট লোড করুন।
  • সতর্কতা : অ্যাসিঙ্ক অ্যাসেট লোডিং ব্যবহার করার সময়, ড্যাংলিং পয়েন্টার বা ক্র্যাশ প্রতিরোধ করতে লোডিং সম্পন্ন হওয়ার কলব্যাকে যেন বৈধতা যাচাই ( IsValid ) করা হয়, তা নিশ্চিত করুন।

আরও তথ্যের জন্য, অ্যাসেট রেফারেন্সিং এবং UE5 দিয়ে মোবাইল গেম তৈরি দেখুন।

স্মার্ট পয়েন্টার এবং গার্বেজ কালেকশন (GC) টিউনিং

C++ ডেভেলপমেন্টের সময় স্মার্ট পয়েন্টার (যেমন TSharedPtr এবং TWeakPtr ) ব্যবহার করলে ড্যাংলিং পয়েন্টার এবং মেমরি লিক প্রতিরোধ করা যায়। এছাড়াও, TWeakPtr ব্যবহার করলে অবজেক্টের প্রতি স্ট্রং রেফারেন্স তৈরি হওয়া এড়ানো যায়, ফলে গার্বেজ কালেক্টর অবজেক্ট সংগ্রহ করার সময় রেফারেন্স কাউন্ট বাড়ায় না। এটি অপ্রয়োজনীয় অবজেক্ট সারভাইভাল প্রতিরোধ করে এবং GC-কে যে রেফারেন্স গ্রাফ ট্র্যাভার্স করতে হয় তার জটিলতা কমিয়ে দেয়, যা GC ওভারহেড উল্লেখযোগ্যভাবে হ্রাস করে। মোবাইল পরিবেশে লেভেল পরিবর্তনের সময় বা নিষ্ক্রিয়তার সময়, যেমন যখন ব্যবহারকারীর কোনো ইন্টারঅ্যাকশন থাকে না, তখন ForceGarbageCollection ট্রিগার করার মাধ্যমে গার্বেজ কালেকশন কার্যকরভাবে পরিচালনা করা যায়। এছাড়াও, গেমটি যখন কোনো বোধগম্য অবস্থায় থাকে বা ব্যাকগ্রাউন্ডে চলে যায় (উদাহরণস্বরূপ, onStop কলব্যাক), তখনও এটি ট্রিগার করা যেতে পারে, যা নিশ্চিত করে যে সক্রিয় গেমপ্লে অভিজ্ঞতাকে প্রভাবিত না করেই গার্বেজ কালেকশন সম্পন্ন হয়।

আরও তথ্যের জন্য, গার্বেজ কালেকশন এবং স্মার্ট পয়েন্টার দেখুন।

স্থানান্তর সারণী সংকোচন ব্যবহার করে অপ্টিমাইজেশন

রিলোকেশন টেবিল কম্প্রেশন একটি অপটিমাইজেশন পদ্ধতি যা অ্যান্ড্রয়েড বাইনারির আকার কমানোর জন্য ELF বাইনারিতে থাকা রিলোকেশন টেবিলের আকার সংকুচিত করে। যখন অ্যান্ড্রয়েডের minSDKVersion ২৩ বা তার বেশি হয়, তখন APS রিলোকেশন টেবিল কম্প্রেশন সমর্থিত হয়; যখন minSDKVersion ২৮ বা তার বেশি হয়, তখন অতিরিক্তভাবে RELR রিলোকেশন টেবিল কম্প্রেশনও সমর্থিত হয়, যা .so ফাইলের আকার উল্লেখযোগ্যভাবে কমিয়ে দেয়। এটি কেবল ডাউনলোডের আকারই কমায় না, বরং রানটাইমে .so mmap-এর মেমরি ফুটপ্রিন্টও হ্রাস করে, যা সামগ্রিক ফিজিক্যাল মেমরির উপর চাপ কমায়।

AndroidToolChain.cs

if (MinSDKVersion >= 28)
{
  Result += " -Wl,--pack-dyn-relocs=android+relr,--use-android-relr-tags";
}
else if (MinSDKVersion >= 23)
{
  Result += " -Wl,--pack-dyn-relocs=android";
}

এই অপ্টিমাইজেশনটি প্রয়োগ করতে, প্রজেক্ট সেটিংসে ‘Enable compression of relocation tables’ অথবা bEnableAdvancedBinaryCompression ’ ভ্যারিয়েবলটি সক্রিয় করা আছে কিনা তা যাচাই করুন।

বাইনারিটিতে RELR কম্প্রেশন সঠিকভাবে প্রয়োগ করা হয়েছে কিনা তা পরীক্ষা করতে, Android NDK থেকে llvm-readelf টুলটি ব্যবহার করুন।

llvm-readelf -d libUnreal.so | grep RELR

বাস্তবে, আনরিয়েল ইঞ্জিনের ThirdPerson টেমপ্লেট তৈরি করে এবং dumpsys meminfo ব্যবহার করে পরিমাপ করলে .so mmap-এর জন্য PSS এবং RSS ব্যবহারে হ্রাস নিশ্চিত হয়।

বিভাগ পিএসএস মোট ব্যক্তিগত নোংরা ব্যক্তিগত পরিচ্ছন্নতা নোংরা অদলবদল করুন আরএসএস মোট
.so mmap কম্প্রেশনের আগে ১৭০,২১০ ২৪,৩৬০ ১৪১,৫৬৪ ২৪২,২০৪
.so mmap কম্প্রেশনের পরে ১৩৮,০৩১ ২৪,৭৪৮ ১০৮,৯৭৬ ২১০,১৪০

টেক্সচার সংকোচন

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

টেক্সচার স্ট্রিমিং অপ্টিমাইজেশন

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