تحسين استخدام الذاكرة في ألعاب Unreal على Android

يُعدّ استخدام الذاكرة أمرًا بالغ الأهمية في تطوير ألعاب Android. عند تطوير الألعاب باستخدام Unreal Engine، يجب تحليل حالة الذاكرة وتتبُّعها بشكل مستمر لاستيفاء قيود الذاكرة هذه، ومنع تسرُّب الذاكرة وعمليات تخصيص الذاكرة المفرطة.

توفير مساحة تخزين في الذاكرة من خلال تقليل عدد تباديل التظليل

من خلال إزالة الخيارات غير المستخدَمة في Lighting أو Mobile Shader Permutation Reduction، يمكنك تقليل عدد تباديل التظليل. يؤدي ذلك إلى تقليل حجم حِزمة التطبيق بشكل كبير، وتقليل عدد عناصر حالة خط أنابيب العرض (PSO)، ومنع إنشاء أهداف عرض أو مواد عرض وهمية غير مستخدَمة، ما يؤدي إلى تقليل ذاكرة وقت التشغيل وتحسين الأداء.

لمزيد من المعلومات، راجِع قسم إعدادات تقليل الإضاءة المتنوعة وتغيير تظليل الأشكال للأجهزة الجوّالة في إرشادات الأداء للأجهزة الجوّالة.

تحسين تحميل مواد العرض

عند تحميل مواد العرض باستخدام مراجع ثابتة، يتم تحميل المحتوى المرتبط الذي لا يتم استخدامه في اللعبة في الذاكرة في الوقت نفسه، ما يؤدي إلى استهلاك غير ضروري للذاكرة. على وجه الخصوص، عند إساءة استخدام الوراثة في Blueprints، يتم تخصيص CDO (كائنات الفئة التلقائية) غير ضرورية من العناصر الرئيسية، ما يؤدي إلى إهدار كمية كبيرة من الذاكرة. في مثل هذه الحالات، طبِّق التقنيات التالية لتحسين استخدام الذاكرة.

  • تعريف رمز C++ وفصل البيانات: يمكنك تحديد الوظائف الأساسية باستخدام UCLASS(Abstract) في رمز C++، وفصلها عن البيانات الفعلية.
  • تقليل عملية التوريث: لا تنفِّذ عملية إعداد البيانات وتحميل مواد العرض إلا في مخططات Blueprints الخاصة بالعُقد الطرفية.
  • استخدام مراجع غير مباشرة: طبِّق مراجع غير مباشرة للسمات باستخدام TSoftObjectPtr لتجنُّب المراجع الثابتة، وحمِّل مواد العرض بشكل غير متزامن عند الحاجة إليها فقط أثناء وقت التشغيل.
  • الاحتياطات: عند استخدام ميزة "تحميل مواد العرض غير المتزامن"، تأكَّد من إجراء عمليات التحقّق من الصحة (IsValid) أثناء معاودة الاتصال عند اكتمال التحميل لمنع المؤشرات المعلقة أو الأعطال.

لمزيد من المعلومات، يُرجى الاطّلاع على الرجوع إلى مواد العرض وإنشاء ألعاب على الأجهزة الجوّالة باستخدام UE5.

المؤشرات الذكية وضبط جمع البيانات المهملة (GC)

يؤدي استخدام المؤشرات الذكية (مثل TSharedPtr وTWeakPtr) أثناء تطوير تطبيقات C++ إلى منع المؤشرات المعلقة وتسرب الذاكرة. بالإضافة إلى ذلك، يؤدي استخدام TWeakPtr إلى تجنُّب إنشاء مراجع قوية للكائنات، وبالتالي لا يزيد جامع البيانات المهملة عدد المراجع عند جمع الكائنات. يؤدي ذلك إلى منع بقاء العناصر غير الضرورية وتقليل تعقيد الرسم البياني للمراجع الذي يجب أن يتتبّعه جامع البيانات المهملة، ما يقلّل بشكل كبير من الحمل الزائد لجامع البيانات المهملة. يمكن إدارة عملية جمع البيانات غير المرغوب فيها بشكل فعّال في بيئات الأجهزة الجوّالة من خلال تشغيل ForceGarbageCollection أثناء عمليات الانتقال بين المستويات أو فترات عدم النشاط، مثل عدم تفاعل المستخدم. بالإضافة إلى ذلك، يمكن تشغيلها عندما تكون اللعبة في حالة ملحوظة أو في الخلفية (على سبيل المثال، onStopعمليات معاودة الاتصال)، ما يضمن تنفيذ عملية جمع البيانات المُهمَلة بدون التأثير في تجربة أسلوب اللعب النشطة.

لمزيد من المعلومات، يُرجى الاطّلاع على Garbage Collection وSmart Pointer.

التحسين باستخدام ضغط جدول النقل

ضغط جدول النقل هو إحدى طرق التحسين التي تضغط حجم جدول النقل في ملفات ELF الثنائية من أجل تقليل حجم ملفات Android الثنائية. عندما يكون الإصدار 23 أو إصدار أحدث من minSDKVersion على Android، يكون ضغط جدول النقل APS متاحًا. وعندما يكون الإصدار 28 أو إصدار أحدث من 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 بشكل صحيح على الملف الثنائي، استخدِم أداة llvm-readelf من حزمة تطوير البرامج الأصلية (NDK) لنظام Android.

llvm-readelf -d libUnreal.so | grep RELR

من الناحية العملية، يؤدي إنشاء نموذج ThirdPerson في Unreal Engine وقياسه باستخدام dumpsys meminfo إلى تأكيد انخفاض استخدام PSS وRSS لعملية mmap الخاصة بملفات ‎ .so.

الفئة إجمالي PSS Private Dirty Private Clean Swap Dirty إجمالي RSS
‫.so mmap قبل الضغط 170,210 24,360 141,564 0 242,204
.so mmap بعد الضغط 138,031 24,748 108,976 0 210,140

ضغط الزخرفة

استخدِم ضغطًا مناسبًا للزخرفة لتقليل استهلاك الذاكرة لموارد الرسومات الإجمالية. يوفّر استخدام ضغط النسيج التكيّفي القابل للتوسيع (ASTC)، وهو معيار الأجهزة الجوّالة، جودة مرئية فائقة مقارنةً بمعيار ETC2 بالحجم نفسه، أو يحقّق نسب ضغط أعلى مع استهلاك أقل للذاكرة ضمن هدف الجودة المرئية نفسه.

تحسين بث الأنسجة

في بيئات الأجهزة الجوّالة، يمكن أن يؤدي استخدام حجم مجموعة نقل البيانات المباشرة للنسيج التلقائي في Unreal Engine إلى تخصيص مجموعة ذاكرة كبيرة جدًا مسبقًا مقارنةً بمواصفات الجهاز. لذلك، من الأفضل تحديد ملفات تعريف الأجهزة الجوّالة واختيار حجم مناسب لمجموعة بث النسيج وفقًا لحدود ذاكرة الجهاز. بالإضافة إلى ذلك، استخدِم ميزة الإحصاءات في "المحرّر" للتحقّق من إحصاءات النسيج وتحديد الأنسجة التي تستهلك قدرًا كبيرًا من الذاكرة والتي تشغل دقة قصوى أثناء وقت التشغيل. يمكنك استخدام هذه الميزة مع ميزة دقة النسيج المطلوبة لفرض حدود أو تقليل الحد الأقصى للدقة على الأنسجة التي تتطلّب أداءً عاليًا، ما يحافظ على استخدام الموارد ضمن مخزن مؤقت مخصّص لذاكرة النسيج.