בדיקת השימוש בזיכרון באמצעות Unreal Engine

המדד 'anonymous RSS + swap' מייצג את העומס על הזיכרון של תהליך מסוים, והוא מדד קריטי לשמירה על יציבות המשחק. הוא משמש כסף לזיכרון עבור Memory Limiter (Android 17 ומעלה) וגם כנקודת השוואה סטנדרטית לנתוני הזיכרון ב-Google Play Console.

קשה למדוד את השימוש בזיכרון שמתאים בדיוק ל-'RSS אנונימי + החלפה' בזמן הריצה או באופן סטטי בתוך Unreal Engine.

כדי לעקוב אחרי השימוש בזיכרון, Unreal Engine מספק את המדד VmRSS + VmSwap. ההגדרה הזו רחבה יותר מ'RSS אנונימי + החלפה' כי VmRSS כולל את rssFile וrssShmem, אבל היא עדיין משמשת כאומדן מהימן.

כדי לנתח את הזיכרון שבשימוש של המשחק, פועלים לפי ההנחיות הבאות:

שאילתת זיכרון באמצעות ממשקי C++‎

אפשר להשתמש בממשקי ה-API הבאים של C++‎ כדי לשלוח שאילתות לגבי מדדי זיכרון:

שאילתת זיכרון קלה

אפשר להשתמש ב-GetMemoryUsedFast כדי לבצע שאילתת זיכרון קלה. ב-Android, השיטה הזו מחזירה את טביעת הרגל המשוערת על ידי ניתוח רק של שדות הזיכרון הנדרשים מ-/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 Engine שמציגה את השורה Mem.
איור 1. שכבת העל 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.
איור 2. ציר הזמן של Unreal Insights שבו מוצג Memory/EstimatedPhysicalMemoryהמונה המותאם אישית
.

אימות השימוש המדויק בזיכרון באמצעות Perfetto

כדי לאמת ערכים מדויקים של מערכת ההפעלה Android ‏anonymous RSS + swap במקום להסתמך על הערכה, אפשר להשתמש ב-Perfetto. ‫Perfetto מתעד מדדי זיכרון ברמת המערכת כדי להעריך את טביעת הרגל המדויקת של המשחק.

ממשק המשתמש של Perfetto שמציג RSS אנונימי, החלפה וסכום השאילתה שלהם.
איור 3. ממשק המשתמש של Perfetto שמציג RSS אנונימי, החלפה ושאילתת הסכום שלהם.