การใช้งานหน่วยความจำบิตแมป

บิตแมปมักเป็นออบเจ็กต์ที่ใช้หน่วยความจำมากที่สุดในแอป การถอดรหัสและการ ดำเนินการปรับขนาดมักอยู่ในเส้นทางวิกฤตสำหรับการแสดงผลเฟรม การเพิ่มประสิทธิภาพการใช้งานหน่วยความจำบิตแมปจะช่วยปรับปรุงการตอบสนองของ UI, อายุการใช้งานแบตเตอรี่ และความเสถียรโดยรวมได้อย่างมากด้วยการลดอาการกระตุก, ANR และการสิ้นสุดกระบวนการที่เกี่ยวข้องกับ OOM

สาเหตุที่ทำให้มีการใช้งานหน่วยความจำบิตแมปสูง

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

แหล่งข้อมูล

วิเคราะห์บิตแมปใน Android Studio

การสร้างโปรไฟล์ Android Studio สำหรับบิตแมป

ใช้เครื่องมือสร้างโปรไฟล์หน่วยความจำเพื่อตรวจสอบการจัดสรรหน่วยความจำแบบเรียลไทม์ บันทึกฮีปดัมป์ และวิเคราะห์ออบเจ็กต์เพื่อหาหน่วยความจำรั่วไหล นอกจากนี้ ให้ใช้เครื่องมือวิเคราะห์ฮีปเพื่อตรวจหาหน่วยความจำรั่วไหล ระบุการจัดสรรบิตแมปที่ซ้ำกัน และแสดงภาพการเก็บรักษาออบเจ็กต์

การตรวจหารอยรั่วโดยอัตโนมัติด้วย LeakCanary

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

เอกสารประกอบเกี่ยวกับประสิทธิภาพบิตแมป

แหล่งข้อมูลเหล่านี้ให้คำแนะนำที่ครอบคลุมเกี่ยวกับแนวทางปฏิบัติแนะนำสำหรับการจัดการบิตแมปอย่างมีประสิทธิภาพในคอมโพเนนต์ต่างๆ ของ Android

รายการตรวจสอบสำหรับนักพัฒนาแอปเพื่อเพิ่มประสิทธิภาพการใช้งานหน่วยความจำบิตแมป

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

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

รายการตรวจสอบสำหรับนักพัฒนาแอปต่อไปนี้จะช่วยคุณเพิ่มประสิทธิภาพการใช้งานหน่วยความจำบิตแมปได้

หลักการสำคัญ พื้นที่ คำอธิบาย
ลด กำจัดบิตแมปที่ซ้ำกัน วิเคราะห์ฮีปดัมป์โดยใช้เครื่องมือสร้างโปรไฟล์หน่วยความจำเพื่อตรวจหาการจัดสรรบิตแมปที่ซ้ำซ้อน ดูคำแนะนำการจัดการหน่วยความจำบิตแมป
ใช้ประโยชน์จากไลบรารีการโหลดรูปภาพ ใช้ไลบรารี เช่น Glide และ Coil เพื่อทำให้การสร้างเธรด การแคช และการถอดรหัสที่มีประสิทธิภาพเป็นไปโดยอัตโนมัติ
ใช้การดาวน์แซมปลิง ถอดรหัสรูปภาพให้ตรงกับขนาดคอนเทนเนอร์ UI เป้าหมายแทนที่จะโหลดชิ้นงานที่มีความละเอียดเต็ม
ใช้ RGB_565 สำหรับรูปภาพทึบแสง ลดการใช้หน่วยความจำที่ใช้ลง 50% โดยเปลี่ยนจาก ARGB_8888 เป็นการกำหนดค่า 16 บิตสำหรับรูปภาพที่ไม่มีความโปร่งใส
จัดลำดับความสำคัญของ VectorDrawable ใช้เวกเตอร์สำหรับไอคอนและกราฟิกพื้นฐานเพื่อให้มั่นใจว่าการปรับขนาดจะคมชัดและใช้หน่วยความจำน้อยที่สุด
เพิ่มประสิทธิภาพการนำส่งรูปภาพฝั่งเซิร์ฟเวอร์ กำหนดค่าแบ็กเอนด์ API เพื่อแสดงรูปภาพที่ปรับให้เหมาะกับความหนาแน่นของอุปกรณ์และขนาดคอนเทนเนอร์ UI
กำจัดขอบที่โปร่งใส หลีกเลี่ยงการจัดสรรหน่วยความจำสำหรับพิกเซลที่ "มองไม่เห็น" โดยใช้ InsetDrawable หรือระยะห่างจากขอบของเลย์เอาต์แทนระยะขอบที่ฝังไว้ ดูการออกแบบแอป Android ที่มีประสิทธิภาพด้านหน่วยความจำ
นำกลับมาใช้ใหม่ กำหนดค่าขนาดแคชที่เหมาะสม ปรับขีดจำกัดแคชในหน่วยความจำและแคชดิสก์ตาม RAM ของอุปกรณ์และความละเอียดของหน้าจอ ดูการแคชบิตแมป
รีไซเคิล ล้างข้อมูลทรัพยากรในเบื้องหลัง ใช้ TRIM_MEMORY_BACKGROUND เพื่อล้างแคชและปรับปรุงการอยู่รอดของกระบวนการในระหว่างที่หน่วยความจำของระบบมีภาระงานสูง
ปล่อยชิ้นงานเมื่อซ่อน UI ใช้ TRIM_MEMORY_UI_HIDDEN เพื่อเผยแพร่แคชบิตแมปเมื่อแอปไม่แสดงต่อผู้ใช้แล้ว
ตรวจสอบการรั่วไหลของหน่วยความจำ ใช้ LeakCanary และเครื่องมือสร้างโปรไฟล์หน่วยความจำเพื่อค้นหาบิตแมปที่เก็บไว้หลังจากทำลาย LifecycleOwner แล้ว โปรดดูหัวข้อจัดการหน่วยความจำของแอป