วิธีตรวจสอบการใช้งานหน่วยความจำด้วยเครื่องมือ Unity

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

ปัจจุบัน การวัดการใช้งานหน่วยความจำที่ตรงกับ 'anonymous RSS + swap' อย่างแม่นยำทั้งในรันไทม์หรือแบบคงที่ภายใน Unity Engine เป็นเรื่องยาก

เพื่อแก้ไขปัญหานี้ หน้านี้จึงขอแนะนำวิธีติดตามค่า 'anonymous RSS + swap' ด้วยความน่าเชื่อถือสูงผ่านการประมาณค่าโดยใช้ Unity Profiler, ProfileRecorder API และ Unity Memory Profiler ในสภาพแวดล้อม Unity Engine

ตรวจสอบการใช้งานหน่วยความจำในรันไทม์

ใน Unity การวัดการใช้หน่วยความจำ 'anonymous RSS + swap' ที่แน่นอนของ Android ในรันไทม์โดยตรงโดยไม่มีค่าใช้จ่ายเพิ่มเติมอาจเป็นเรื่องยาก อย่างไรก็ตาม คุณสามารถประมาณค่านี้ได้อย่างใกล้เคียง (ความคลาดเคลื่อนไม่เกิน ~10%) โดยใช้ Profiler API ในตัวของ Unity

วิธีที่ 1: ใช้ Profiler

คุณสามารถประมาณการใช้งานหน่วยความจำทั้งหมดได้โดยการรวมค่าที่ Profiler API ต่อไปนี้แสดงผล

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 หน่วยความจำที่สงวนไว้'

  • ในการสร้างเวอร์ชันที่เผยแพร่: ใช้ 'หน่วยความจำทั้งหมดที่สงวนไว้' โดยตรง

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

ข้อจำกัด:

  • API เหล่านี้ไม่สามารถติดตามการจัดสรรหน่วยความจำที่ข้าม Memory Manager ของ Unity (เช่น NativeMalloc(IntPtr size))

  • API เหล่านี้อาจไม่ได้รับการสนับสนุน ทั้งนี้ขึ้นอยู่กับเวอร์ชัน Unity ที่คุณใช้

วิเคราะห์การแบ่งหน่วยความจำ (การวิเคราะห์แบบคงที่)

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

Unity Memory Profiler

หากต้องการวิเคราะห์หน่วยความจำอย่างละเอียดและเพิ่มประสิทธิภาพเกม ให้ใช้แพ็กเกจ เครื่องมือสร้างโปรไฟล์หน่วยความจำ Unity วิธีค้นหารายการที่สอดคล้องกับการใช้ 'anonymous RSS + swap' ของระบบปฏิบัติการ Android

  1. จับภาพสแนปชอตโดยใช้ Unity Memory Profiler
  2. เปิดสแนปชอตแล้วไปที่หน่วยความจำทั้งหมด > หน่วยความจำที่ใช้งานอยู่บนอุปกรณ์
  3. คำนวณผลรวมของรายการต่อไปนี้

    • ไม่ได้ติดตาม
    • Android Runtime
    • เนทีฟ
    • มีการจัดการ
    เมตริกหน่วยความจำที่ดูได้เมื่อตั้งค่าเป็นหน่วยความจำที่ใช้งานอยู่ในเครื่องมือสร้างโปรไฟล์หน่วยความจำของ Unity
    รูปที่ 1 คำอธิบายหน่วยความจำจะจัดเก็บไว้ในหน่วยความจำที่ใช้งานอยู่

ผลรวมทั้งหมดทำหน้าที่เป็นตัวแทนที่ใช้งานได้จริงสำหรับ 'anonymous RSS + swap' ของระบบปฏิบัติการ Android ซึ่งให้ข้อมูลเชิงลึกที่นำไปปฏิบัติได้สำหรับการวิเคราะห์หน่วยความจำของเกม

ข้อจำกัด:

  • เมื่อหน่วยความจำมีแรงกดดันสูง ระบบปฏิบัติการ Android อาจบีบอัดหรือสลับหน้าหน่วยความจำที่ใช้งานอยู่เพื่อเพิ่ม RAM เนื่องจากเครื่องมือสร้างโปรไฟล์หน่วยความจำของ Unity ไม่สามารถติดตามหน่วยความจำที่สลับได้ จึงอาจเกิดความคลาดเคลื่อนในสถานการณ์ที่มีการใช้งานหน่วยความจำสูง

  • ฟีเจอร์เหล่านี้อาจถูกจำกัด ทั้งนี้ขึ้นอยู่กับเวอร์ชัน Unity ที่คุณใช้

การประเมินที่แม่นยำยิ่งขึ้น

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