บิตแมปมักเป็นออบเจ็กต์ที่ใช้หน่วยความจำมากที่สุดในแอป การถอดรหัสและการ ดำเนินการปรับขนาดมักอยู่ในเส้นทางวิกฤตสำหรับการแสดงผลเฟรม การเพิ่มประสิทธิภาพการใช้งานหน่วยความจำบิตแมปจะช่วยปรับปรุงการตอบสนองของ 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 แล้ว โปรดดูหัวข้อจัดการหน่วยความจำของแอป |