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

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

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

برای ردیابی میزان استفاده از حافظه، موتور Unreal معیار VmRSS + VmSwap را ارائه می‌دهد. اگرچه این معیار از «RSS + swap ناشناس» گسترده‌تر است زیرا VmRSS شامل rssFile و rssShmem می‌شود، اما همچنان به عنوان یک تخمین قابل اعتماد عمل می‌کند.

برای تجزیه و تحلیل ردپای حافظه بازی خود، این راهنما را دنبال کنید:

پرس و جو از حافظه با استفاده از API های C++

برای پرس‌وجو در مورد معیارهای حافظه، از APIهای C++ زیر استفاده کنید:

پرس و جوی حافظه سبک

از GetMemoryUsedFast برای یک پرس‌وجوی حافظه سبک استفاده کنید. در اندروید، این روش با تجزیه تنها فیلدهای حافظه لازم از /proc/self/status ، به جای خواندن کل فایل، میزان مصرف تخمینی را برمی‌گرداند.

آمار دقیق حافظه

GetStats برای پرس‌وجوی آمار دقیق حافظه پلتفرم استفاده کنید. این متد آمار جامعی از حافظه پلتفرم ارائه می‌دهد و هر دو FPlatformMemoryStats.UsedPhysical و FPlatformMemoryStats.RssFile را برمی‌گرداند. از آنجایی که UsedPhysical مجموع VmRSS و VmSwap است، می‌توانید با کم کردن RssFile از آن، به مقدار معیار نزدیک‌تر شوید.

#include "HAL/PlatformMemory.h"

uint64 GetEstimatedPhysicalMemory()
{
  FPlatformMemoryStats Stats = FPlatformMemory::GetStats();

#if PLATFORM_ANDROID
    return Stats.UsedPhysical - Stats.RssFile;
#else
    return Stats.UsedPhysical;
#endif
}

نظارت بر حافظه با استفاده از دستورات کنسول

از این روش برای نظارت بر روند حافظه در حین اجرای بازی روی دستگاه استفاده کنید. برای باز کردن کنسول، با چهار انگشت روی صفحه ضربه بزنید و سپس دستورات زیر را وارد کنید.

فرمان توضیحات
stat unit میزان استفاده فعلی از حافظه فیزیکی را در ردیف Mem نمایش می‌دهد و هر فریم آن را به‌روزرسانی می‌کند.
stat unitmax میانگین و اوج استفاده از حافظه فیزیکی و مجازی را در ردیف Mem نمایش می‌دهد.

پوشش واحد آمار موتور Unreal که ردیف Mem را نشان می‌دهد.
شکل ۱. پوشش stat unit که ردیف Mem را نشان می‌دهد.

با Unreal Insights حافظه را تجسم کنید

Unreal Insights به شما امکان می‌دهد معیارهای حافظه، مانند آمار حافظه پلتفرم و شمارنده‌های سفارشی را در طول زمان با استفاده از نمودارهای جدول زمانی دقیق فریم، نظارت و تجسم کنید.

  1. دستگاه خود را با استفاده از پرچم‌هایی که شامل شمارنده‌های default,counters هستند به کانال‌های ردیابی حافظه متصل کنید تا نمودار PlatformMemory/UsedPhysical ( VmRSS + VmSwap ) را در کنار جدول زمانی فریم مشاهده کنید.
  2. اختیاری: برای ردیابی دقیق‌تر معیارهای حافظه سفارشی، با استفاده از TRACE_DECLARE_MEMORY_COUNTER و TRACE_COUNTER_SET یک شمارنده ردیابی سفارشی تعریف و به‌روزرسانی کنید.
#include "ProfilingDebugging/CountersTrace.h"

TRACE_DECLARE_MEMORY_COUNTER(Trace_EstimatedPhysicalMemory, TEXT("Memory/EstimatedPhysicalMemory"));

void UpdateMemoryTraceCounter()
{
    // Note: Ensure GetEstimatedPhysicalMemory() is defined as shown
    // in the Query memory at runtime using C++ APIs section.
    TRACE_COUNTER_SET(Trace_EstimatedPhysicalMemory, GetEstimatedPhysicalMemory());
}

بینش‌های غیرواقعی که حافظه/حافظه فیزیکی تخمینی را نشان می‌دهند.
شکل ۲. جدول زمانی Unreal Insights که شمارنده Memory/EstimatedPhysicalMemory سفارشی را نشان می‌دهد.

تأیید دقیق میزان استفاده از حافظه با استفاده از Perfetto

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

رابط کاربری Perfeto که RSS ناشناس، swap و پرس و جوی مجموع آنها را نشان می‌دهد.
شکل ۳. رابط کاربری Perfetto که RSS ناشناس، swap و پرس‌وجوی مجموع آنها را نشان می‌دهد.