نحوه بررسی میزان استفاده از حافظه با ابزارهای یونیتی

در سیستم اندروید، آستانه محدودیت حافظه برای Memory Limiter (اندروید ۱۷+) و مقدار معیار برای حافظه حیاتی در کنسول گوگل پلی، « anonymous RSS + swap » است. این مقدار نشان دهنده سطح فشار حافظه فیزیکی است که در واقع توسط فرآیند اشغال شده است و یک معیار حیاتی است که باید برای عملکرد پایدار برنامه نظارت شود.

در حال حاضر، اندازه‌گیری میزان استفاده از حافظه که دقیقاً با «RSS + swap ناشناس» مطابقت داشته باشد، چه در زمان اجرا و چه به صورت استاتیک در موتور Unity دشوار است.

برای پرداختن به این موضوع، این صفحه نحوه ردیابی مقدار « RSS + swap ناشناس » را با قابلیت اطمینان بالا از طریق تقریب با استفاده از Unity Profiler، ProfileRecorder API و Unity Memory Profiler در محیط Unity Engine معرفی می‌کند.

بررسی میزان استفاده از حافظه در زمان اجرا

در یونیتی، اندازه‌گیری مستقیم میزان دقیق مصرف حافظه « RSS ناشناس + swap » اندروید در زمان اجرا بدون سربار می‌تواند چالش‌برانگیز باشد. با این حال، می‌توانید با استفاده از APIهای Profiler داخلی یونیتی، این مقدار را (با اختلاف حدود ۱۰٪) به دقت تخمین بزنید.

روش ۱: استفاده از پروفایلر

شما می‌توانید با جمع کردن مقادیر برگردانده شده توسط APIهای Profiler زیر، کل میزان استفاده از حافظه را تخمین بزنید:

using UnityEngine;
using UnityEngine.Profiling;

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

        return totalReserved + monoHeapSize;
    }
}

روش دوم: استفاده از کلاس ProfilerRecorder

شما می‌توانید معیارهای Total Reserved Memory و Gfx Reserved Memory را با استفاده از ProfilerRecorder پیگیری کنید:

  • در نسخه‌های در حال توسعه: محاسبه‌ی « کل حافظه‌ی رزرو شده » - « حافظه‌ی رزرو شده‌ی Gfx ».

  • در نسخه‌های منتشر شده: مستقیماً از « حافظه کل رزرو شده » استفاده کنید.

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;
    }
}

محدودیت :

  • تخصیص‌های حافظه‌ای که از مدیریت حافظه‌ی یونیتی عبور می‌کنند (مثلاً NativeMalloc(IntPtr size)) توسط این APIها قابل ردیابی نیستند.

  • بسته به نسخه Unity شما، ممکن است این APIها پشتیبانی نشوند.

تجزیه و تحلیل خرابی حافظه (تحلیل استاتیک)

اگر در زمان اجرا، مصرف بالای حافظه تشخیص داده شود، باید محل مصرف حافظه را شناسایی کنید. تجزیه و تحلیل توزیع حافظه به شما امکان می‌دهد تخصیص‌های غیرضروری را حذف کرده و میزان اشغال حافظه کلی بازی را کاهش دهید.

پروفایلر حافظه یونیتی

برای انجام یک تحلیل عمیق حافظه و بهینه‌سازی بازی خود، از بسته Unity Memory Profiler استفاده کنید. برای یافتن موارد مربوط به استفاده از ' anonymous RSS + swap ' در سیستم عامل اندروید:

  1. با استفاده از Unity Memory Profiler یک Snapshot بگیرید.
  2. اسنپ‌شات را باز کنید و به All of Memory > Resident Memory on Device بروید.
  3. مجموع موارد زیر را محاسبه کنید:

    • ردیابی نشده
    • زمان اجرای اندروید
    • بومی
    • مدیریت شده
    معیارهای حافظه قابل مشاهده هستند وقتی که روی حافظه مقیم در پروفایلر حافظه یونیتی تنظیم شده باشند.
    شکل ۱. توصیفات حافظه در حافظه‌ی مقیم ذخیره می‌شوند

مجموع این اطلاعات به عنوان یک جایگزین عملی برای «RSS + swap ناشناس » سیستم عامل اندروید عمل می‌کند و بینش‌های کاربردی برای تحلیل حافظه بازی ارائه می‌دهد.

محدودیت :

  • تحت فشار سنگین حافظه، سیستم عامل اندروید ممکن است صفحات حافظه فعال را فشرده یا جابجا کند تا رم را آزاد کند. از آنجا که Unity Memory Profiler نمی‌تواند حافظه جابجا شده را ردیابی کند، ممکن است در سناریوهای استفاده زیاد از حافظه، اختلافاتی ایجاد شود.

  • این ویژگی‌ها ممکن است بسته به نسخه یونیتی شما محدود باشند.

ارزیابی دقیق‌تر

برای تأیید مقادیر دقیق « RSS + swap ناشناس » سیستم عامل اندروید، از Perfetto استفاده کنید. این ابزار به شما امکان می‌دهد میزان دقیق استفاده از حافظه در سطح سیستم را اندازه‌گیری کرده و ردپای حافظه بازی خود را به طور کامل تجزیه و تحلیل کنید.