ในระบบ 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
- จับภาพสแนปชอตโดยใช้ Unity Memory Profiler
- เปิดสแนปชอตแล้วไปที่หน่วยความจำทั้งหมด > หน่วยความจำที่ใช้งานอยู่บนอุปกรณ์
คำนวณผลรวมของรายการต่อไปนี้
- ไม่ได้ติดตาม
- Android Runtime
- เนทีฟ
- มีการจัดการ
รูปที่ 1 คำอธิบายหน่วยความจำจะจัดเก็บไว้ในหน่วยความจำที่ใช้งานอยู่
ผลรวมทั้งหมดทำหน้าที่เป็นตัวแทนที่ใช้งานได้จริงสำหรับ 'anonymous RSS + swap' ของระบบปฏิบัติการ Android ซึ่งให้ข้อมูลเชิงลึกที่นำไปปฏิบัติได้สำหรับการวิเคราะห์หน่วยความจำของเกม
ข้อจำกัด:
เมื่อหน่วยความจำมีแรงกดดันสูง ระบบปฏิบัติการ Android อาจบีบอัดหรือสลับหน้าหน่วยความจำที่ใช้งานอยู่เพื่อเพิ่ม RAM เนื่องจากเครื่องมือสร้างโปรไฟล์หน่วยความจำของ Unity ไม่สามารถติดตามหน่วยความจำที่สลับได้ จึงอาจเกิดความคลาดเคลื่อนในสถานการณ์ที่มีการใช้งานหน่วยความจำสูง
ฟีเจอร์เหล่านี้อาจถูกจำกัด ทั้งนี้ขึ้นอยู่กับเวอร์ชัน Unity ที่คุณใช้
การประเมินที่แม่นยำยิ่งขึ้น
หากต้องการยืนยันค่า 'anonymous RSS + swap' ที่แน่นอนของระบบปฏิบัติการ Android ให้ใช้ Perfetto ซึ่งช่วยให้คุณวัดการใช้งานหน่วยความจำระดับระบบได้อย่างแม่นยำและวิเคราะห์หน่วยความจำที่ใช้ของเกมได้อย่างละเอียด