يعمل نظام Android الأساسي على أساس أنّ الذاكرة الحرة هي ذاكرة مهدرة. يحاول نظام التشغيل Android استخدام كل الذاكرة المتاحة في جميع الأوقات. على سبيل المثال، يحتفظ النظام بالتطبيقات في الذاكرة بعد إغلاقها حتى يتمكّن المستخدم من العودة إليها بسرعة. لهذا السبب، غالبًا ما تعمل أجهزة Android بذاكرة حرة قليلة جدًا (راجِع تخصيص ذاكرة Android هنا).
تراقب عملية برنامج الخلفية لإغلاق التطبيقات بسبب نقص الذاكرة (LMK) في نظام التشغيل Android حالة الذاكرة لنظام Android قيد التشغيل وتستجيب للضغط المرتفع على الذاكرة من خلال إنهاء العمليات الأقل أهمية للحفاظ على أداء النظام عند مستويات مقبولة.
لتحديد العملية التي سيتم إيقافها، يستخدم البرنامج الخفي LMK نتيجة خطأ نفاد الذاكرة تُسمى oom_adj_score من أجل تحديد أولويات العمليات الجارية. ويتم إيقاف العمليات التي حصلت على درجة عالية أولاً. يتم إيقاف التطبيقات التي تعمل في الخلفية أولاً، ثم عمليات النظام. يسرد الجدول التالي فئات تسجيل LMK من الأعلى إلى الأدنى. يتم أولاً إيقاف العناصر في الفئة ذات أعلى نتيجة، في الصف الأول:
أدوات تحليل استخدام الذاكرة
يمكن أن تساعدك الأدوات التالية في العثور على مشاكل الذاكرة وتشخيصها بالطرق التالية:
- اطّلِع على كيفية تخصيص تطبيقك للذاكرة بمرور الوقت. يمكنك الاطّلاع على رسم بياني في الوقت الفعلي يوضّح مقدار الذاكرة التي يستخدمها تطبيقك وعدد عناصر Java التي تم تخصيصها ووقت تنفيذ عملية جمع البيانات المُهمَلة.
- بدء أحداث جمع البيانات المُهمَلة وأخذ لقطة من مساحة التخزين المؤقت في Java أثناء تشغيل تطبيقك
- تسجيل عمليات تخصيص الذاكرة في تطبيقك وفحص جميع العناصر التي تم تخصيصها وعرض تتبُّع تسلسل استدعاء الدوال البرمجية لكل عملية تخصيص
إذا كانت لعبتك تعمل على محرك أصلي، استخدِم HWAddress Sanitizer لتصحيح أخطاء تخصيص الذاكرة الأصلية.
أداة "محلّل الذاكرة" في "استوديو Android"
يوفّر "استوديو Android" محلّل الذاكرة كمكوّن من أداة Android Profiler التي تساعدك في تحديد تسرّب الذاكرة والاستخدام الزائد للذاكرة الذي يمكن أن يؤدي إلى حدوث تقطّع وتجمّد وحتى تعطُّل التطبيق. يعرض أداة Profiler رسمًا بيانيًا في الوقت الفعلي لاستخدام الذاكرة في تطبيقك، ويتيح لك التقاط لقطة لأجزاء من الذاكرة، وفرض عملية جمع البيانات المُهمَلة، وتتبُّع عملية تخصيص الذاكرة.
أدوات تحليل استخدام الذاكرة في Unity
إذا كنت تستخدم Unity Engine لإنشاء تطبيقاتك، يمكنك اتّباع إرشادات تحديد مستوى الذاكرة في Unity. توفّر Unity أداتَين لتحليل استخدام الذاكرة في تطبيقك في Unity.
الأول هو وحدة Memory Profiler، وهي أداة تحليل مدمَجة تمنحك معلومات أساسية حول الأماكن التي يستخدم فيها تطبيقك الذاكرة.
الأداة الثانية هي حزمة محلّل الذاكرة، وهي حزمة Unity يمكنك إضافتها إلى مشروعك. تضيف الحزمة نافذة إضافية إلى "أداة تحليل الذاكرة" في Unity Editor. يتيح لك محلّل الذاكرة تحليل استخدام الذاكرة في تطبيقك بمزيد من التفصيل. يمكنك تخزين اللقطات ومقارنتها للعثور على تسريبات الذاكرة أو الاطّلاع على تخطيط الذاكرة للعثور على مشاكل تجزئة الذاكرة.
Unreal Memory Insights
يمكن للتطبيقات التي تم إنشاؤها باستخدام Unreal Engine الاستفادة من Unreal Memory Insights للاطّلاع على معلومات تفصيلية حول عملية تخصيص الذاكرة وإلغاء تخصيصها، بما في ذلك علامات Low Level Memory (LLM) وCallstacks المرتبطة بمساحات الذاكرة.
يمكن لنظام طلبات البحث في "إحصاءات الذاكرة" العثور على عمليات تخصيص نشطة في أي وقت، وتحديد التغييرات في استخدام الذاكرة، وتحديد مواقع تسرُّب الذاكرة، والتمييز بين عمليات التخصيص القصيرة الأجل والطويلة الأجل.
بدءًا من الإصدار 5.4 من Unreal Engine، تتيح أداة Memory Insights تتبُّع الذاكرة باستخدام حِزم استدعاءات لمشاريع Android.
إحصاءات حول انخفاض سعة الذاكرة
يوفر نظام التشغيل Android عمليات ردّ اتصال وواجهات برمجة تطبيقات تتيح لك تقليل متطلبات الذاكرة في لعبتك وتحديد سبب إيقاف عمليات تشغيل الألعاب السابقة.
عمليات الاسترداد
لا تسجِّل عمليات معاودة الاتصال trim المتوقّفة نهائيًا. لا يتضمّن نظام التشغيل Android أي واجهات برمجة تطبيقات لرصد أحداث ضغط الذاكرة الأصلية عندما يواجه النظام حدود الذاكرة.
لم تكن عمليات معاودة الاتصال الخاصة بالتقليم مفيدة في منع عمليات الإغلاق بسبب نقص الذاكرة، لذا أوقف نظام التشغيل Android جميعها باستثناء TRIM_MEMORY_UI_HIDDEN وTRIM_MEMORY_BACKGROUND.
إنهاء اللعبة
يحاول نظام التشغيل Android استخدام كل الذاكرة المتاحة لتخزين التطبيقات والألعاب مؤقتًا لضمان تحميلها بسرعة (ما يؤدي إلى تحسين تجربة المستخدم)، ولكن عندما تصبح الذاكرة محدودة، يوقف النظام التطبيقات والألعاب التي تستهلك أكبر قدر من الذاكرة لإتاحة مساحة كافية لتشغيل الجهاز بشكل طبيعي.
تشمل المعلومات والإحصاءات وأفضل الممارسات التي تساعدك في تحقيق استخدام أفضل لذاكرة الألعاب ما يلي:
- استخدام
ApplicationExitInfo: تعرض واجهة برمجة التطبيقات هذه السبب الذي أدّى إلى إيقاف تشغيل اللعبة السابقة من قِبل نظام Android. استخدِمApplicationExitInfoللتحقّق من نقص الذاكرة كسبب لإيقاف عملية سابقة. تحقَّق مما إذا تم إيقاف اللعبة بسبب نقص الذاكرة حتى يمكن تحسينها لاستخدام مساحة أقل من الذاكرة على هذا الجهاز. - الاطّلاع على إجمالي ذاكرة الوصول العشوائي (RAM) الفعلية:
لمنع إغلاق الألعاب عندما تكون في المقدّمة ومطابقة إمكانات الجهاز، اطّلِع على إجمالي ذاكرة الوصول العشوائي (RAM) الفعلية لكل جهاز للحصول على دقة عالية في تعديل استخدام ذاكرة اللعبة استنادًا إلى ذلك. إذا كان الهدف هو منع إغلاق التطبيقات بعد فترة قصيرة من نقلها إلى الخلفية (للسماح للاعب بتنفيذ مهام متعددة)، استخدِم عمليات الاسترجاع trim (
TRIM_MEMORY_UI_HIDDENتحديدًا) لتقليل استخدام الذاكرة في لعبتك.