كيفية التحقّق من استخدام الذاكرة باستخدام أدوات Unity

في نظام التشغيل Android، يكون الحدّ الأدنى لمقدار الذاكرة في Memory Limiter (الإصدار 17 من نظام التشغيل Android أو الإصدارات الأحدث) وقيمة قياس أداء مؤشر الذاكرة الحيوي في Google Play Console هي حجم مجموعة البيانات المقيمة بدون اسم + مساحة التبديل. تمثّل هذه القيمة مستوى ضغط الذاكرة الفعلي الذي يشغله التطبيق، وهي مقياس مهم يجب مراقبته لضمان استقرار التطبيق.

في الوقت الحالي، يصعب قياس استخدام الذاكرة الذي يتطابق تمامًا مع "RSS مجهول الهوية + مساحة التبديل"، سواء في وقت التشغيل أو بشكل ثابت داخل Unity Engine.

لحلّ هذه المشكلة، توضّح هذه الصفحة كيفية تتبُّع قيمة خلاصة RSS المجهولة الهوية + التبديل بموثوقية عالية من خلال التقريب باستخدام Unity Profiler وProfileRecorder API وUnity Memory Profiler في بيئة Unity Engine.

التحقّق من استخدام الذاكرة في وقت التشغيل

في Unity، قد يكون من الصعب قياس استخدام الذاكرة الدقيق لخدمة RSS المجهولة الهوية + مساحة التبديل في Android مباشرةً أثناء وقت التشغيل بدون تكلفة إضافية. ومع ذلك، يمكنك تقدير هذه القيمة بدقة (في حدود تفاوت% 10 تقريبًا) باستخدام واجهات برمجة التطبيقات المضمّنة في أداة Profiler من Unity.

الطريقة 1: استخدام أداة Profiler

يمكنك تقدير إجمالي استخدام الذاكرة من خلال جمع القيم التي تعرضها واجهات برمجة التطبيقات التالية الخاصة بأداة Profiler:

using UnityEngine;
using UnityEngine.Profiling;

public class MemoryMonitor : MonoBehaviour
{
    public long GetEstimatedMemoryUsageBytes()
    {
        long totalReserved = Profiler.GetTotalReservedMemoryLong();
        long monoHeapSize = Profiler.GetMonoHeapSizeLong();

        return totalReserved + monoHeapSize;
    }
}

الطريقة 2: استخدام فئة ProfilerRecorder

يمكنك تتبُّع مقياسَي إجمالي الذاكرة المحجوزة وذاكرة Gfx المحجوزة باستخدام ProfilerRecorder:

  • في إصدارات التطوير: احسب إجمالي الذاكرة المحجوزة - ذاكرة Gfx المحجوزة.

  • في إصدارات Release: استخدِم إجمالي الذاكرة المحجوزة مباشرةً.

using Unity.Profiling;
using UnityEngine;

public class MemoryMonitor : MonoBehaviour
{
    ProfilerRecorder totalRecorder;

#if DEVELOPMENT_BUILD
    ProfilerRecorder gfxRecorder;
#endif

    private void OnEnable()
    {
        totalRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");

#if DEVELOPMENT_BUILD
        gfxRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Gfx Reserved Memory");
#endif
    }

    private void OnDisable()
    {
        totalRecorder.Dispose();

#if DEVELOPMENT_BUILD
        gfxRecorder.Dispose();
#endif
    }

    public long GetEstimatedMemoryUsageBytes()
    {
#if DEVELOPMENT_BUILD
        if (totalRecorder.Valid && gfxRecorder.Valid)
        {
            return totalRecorder.LastValue - gfxRecorder.LastValue;
        }
#else
        if (totalRecorder.Valid)
        {
            return totalRecorder.LastValue;
        }
#endif
        return 0;
    }
}

القيود:

  • لا يمكن تتبُّع عمليات تخصيص الذاكرة التي تتجاوز "مدير الذاكرة" في Unity (مثل NativeMalloc(IntPtr size)) باستخدام واجهات برمجة التطبيقات هذه.

  • قد لا تكون واجهات برمجة التطبيقات هذه متاحة حسب إصدار Unity.

تحليل تفاصيل استخدام الذاكرة (التحليل الثابت)

في حال رصد معدّل استخدام مرتفع للذاكرة أثناء وقت التشغيل، عليك تحديد موضع استهلاك الذاكرة. يتيح لك تحليل توزيع الذاكرة إمكانية التخلّص من عمليات التخصيص غير الضرورية وتقليل استهلاك الذاكرة الإجمالي الذي تستخدمه اللعبة.

Unity Memory Profiler

لإجراء تحليل تفصيلي للذاكرة وتحسين لعبتك، استخدِم حزمة Unity Memory Profiler. للعثور على العناصر المتوافقة مع استخدام خلاصات RSS المجهولة الهوية + التبديل في نظام التشغيل Android:

  1. التقِط لقطة باستخدام أداة Unity Memory Profiler.
  2. افتح اللقطة وانتقِل إلى كل بيانات الذاكرة > الذاكرة المقيمة على الجهاز.
  3. احسب مجموع العناصر التالية:

    • لم يتم تتبُّعه
    • وقت تشغيل Android
    • الإعلانات المدمجة مع المحتوى
    • مُدار
    مقاييس الذاكرة التي يمكن عرضها عند ضبطها على "الذاكرة المقيمة" في "أداة تحليل الذاكرة" في Unity
    الشكل 1. يتم تخزين "أوصاف الذاكرة" في الذاكرة المقيمة

يعمل المجموع الكلي كبديل عملي عن ذاكرة RSS المجهولة + مساحة الإبدال في نظام التشغيل Android، ما يقدّم إحصاءات قابلة للتنفيذ لتحليل ذاكرة الألعاب.

القيود:

  • في حال الضغط الشديد على الذاكرة، قد يضغط نظام التشغيل Android صفحات الذاكرة النشطة أو يبدّلها لإتاحة مساحة أكبر في ذاكرة الوصول العشوائي. وبما أنّ أداة Unity Memory Profiler لا يمكنها تتبُّع الذاكرة المبدَّلة، قد تحدث اختلافات في سيناريوهات الاستخدام العالي للذاكرة.

  • قد تكون هذه الميزات محدودة حسب إصدار Unity.

تقييم أكثر دقة

للتحقّق من قيم "خلاصة RSS مجهولة المصدر + تبديل" الدقيقة لنظام التشغيل Android، استخدِم Perfetto. يتيح لك هذا الإجراء قياس استخدام الذاكرة الدقيق على مستوى النظام وتحليل حجم الذاكرة التي تستخدمها لعبتك بشكل شامل.