ตรวจสอบการใช้งานหน่วยความจำด้วย Unreal Engine

"**anonymous RSS + swap**" ซึ่งแสดงถึงแรงกดดันด้านหน่วยความจำของกระบวนการ เป็นเมตริกที่สำคัญสำหรับการรักษาเสถียรภาพของเกม โดยทำหน้าที่เป็นทั้ง เกณฑ์ขีดจำกัดหน่วยความจำสำหรับ ตัวจำกัดหน่วยความจำ (Android 17 และ ขึ้นไป) และเกณฑ์มาตรฐานสำหรับข้อมูลสำคัญเกี่ยวกับหน่วยความจำใน Google Play Console

การวัดการใช้งานหน่วยความจำที่ตรงกับ "anonymous RSS + swap" อย่างแม่นยำนั้นทำได้ยาก ไม่ว่าจะวัดขณะรันไทม์หรือวัดแบบคงที่ภายใน Unreal Engine

Unreal Engine มี VmRSS + VmSwap เมตริก สำหรับการติดตามการใช้งานหน่วยความจำ แม้ว่าเมตริกนี้จะกว้างกว่า "anonymous RSS + swap" เนื่องจาก VmRSS มี rssFile และ rssShmem แต่ก็ยังคงเป็นค่าประมาณที่เชื่อถือได้

ทำตามคำแนะนำนี้เพื่อวิเคราะห์หน่วยความจำที่ใช้ของเกม

ค้นหาหน่วยความจำโดยใช้ C++ API

ใช้ C++ API ต่อไปนี้เพื่อค้นหาเมตริกหน่วยความจำ

การค้นหาหน่วยความจำแบบเบา

ใช้ 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
}

ตรวจสอบหน่วยความจำโดยใช้คำสั่งคอนโซล

ใช้วิธีนี้เพื่อตรวจสอบแนวโน้มหน่วยความจำขณะที่เกมกำลังทำงานบนอุปกรณ์ หากต้องการเปิดคอนโซล ให้แตะหน้าจอด้วย 4 นิ้ว แล้วป้อนคำสั่งต่อไปนี้

คำสั่ง คำอธิบาย
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 แสดงหน่วยความจำ/หน่วยความจำจริงโดยประมาณ
รูปที่ 2 ไทม์ไลน์ Unreal Insights ที่แสดงตัวนับที่กำหนดเอง Memory/EstimatedPhysicalMemory

ยืนยันการใช้งานหน่วยความจำที่แม่นยำโดยใช้ Perfetto

หากต้องการยืนยันค่า 'anonymous RSS + swap' ที่แน่นอนของระบบปฏิบัติการ Android แทนที่จะใช้ค่า ประมาณ ให้ใช้ Perfetto Perfetto จะบันทึกเมตริกหน่วยความจำระดับระบบเพื่อประเมินการใช้หน่วยความจำที่แน่นอนของเกม

UI ของ Perfetto แสดง RSS แบบไม่ระบุตัวตน, Swap และการค้นหาผลรวม
รูปที่ 3 UI ของ Perfetto ที่แสดงการค้นหา anonymous RSS, swap และผลรวม