ลดการใช้หน่วยความจำกราฟิก

ในสแต็กกราฟิก แคชบัฟเฟอร์ต่อเลเยอร์จะอยู่ระหว่าง Composer HAL และ SurfaceFlinger เพื่อลดค่าใช้จ่ายที่เกี่ยวข้องกับการส่งตัวอธิบายไฟล์ผ่าน IPC ก่อน Android 14 แคชบัฟเฟอร์นี้จะไม่ถูกล้างถาวรเมื่อ GraphicBufferProducer ยกเลิกการเชื่อมต่อจาก SurfaceFlinger GraphicBufferConsumer เช่น เมื่อ MediaCodec ถูกตัดการเชื่อมต่อจาก SurfaceView ตั้งแต่ Android 14 เป็นต้นไป คุณสามารถบังคับให้ล้างแคชบัฟเฟอร์นี้เพื่อลดการใช้หน่วยความจำกราฟิกได้

เลือกจากหนึ่งในสองตัวเลือกต่อไปนี้:

  • สำหรับอุปกรณ์ที่เปิดตัวด้วย Android 14 ขึ้นไป คุณต้องใช้งาน Composer HAL API เวอร์ชัน 3.2 ใหม่ ตัวเลือกนี้จะเปิดใช้งานตามค่าเริ่มต้นและประหยัดหน่วยความจำได้มากที่สุด อุปกรณ์ที่อัปเกรดเป็น 14 และใหม่กว่าสามารถใช้ตัวเลือกนี้เพื่อให้ได้รับประโยชน์จากหน่วยความจำเต็มรูปแบบ
  • สำหรับอุปกรณ์ที่อัปเกรดเป็น Android 14 ที่คุณไม่ต้องการใช้ Composer HAL 3.2 API คุณสามารถเปิดใช้ตัวเลือกที่เข้ากันได้แบบย้อนหลังได้ ตัวเลือกนี้จะบันทึกหน่วยความจำได้เกือบเท่ากับตัวเลือกก่อนหน้า

สองส่วนต่อไปนี้จะอธิบายวิธีการใช้แต่ละตัวเลือก

ใช้ Composer HAL 3.2 API

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

  1. อัปเดตการใช้งาน Composer HAL ของคุณเป็นเวอร์ชัน 3.2
  2. ประมวลผล LayerCommand::bufferSlotsToClear โดยการล้างรายการแคชบัฟเฟอร์ที่ระบุโดยหมายเลขสล็อตที่พบในรายการ

Composer HAL 3.2 API ที่เกี่ยวข้องกับหน่วยความจำบัฟเฟอร์กราฟิก รวมถึง LayerCommand:bufferSlotsToClear อยู่ใน LayerCommand.aidl-

เปิดใช้งานตัวเลือกที่เข้ากันได้แบบย้อนหลัง

ตัวเลือกการลดหน่วยความจำที่เข้ากันได้แบบย้อนหลังจะแทนที่บัฟเฟอร์จริงในช่องแคชด้วยบัฟเฟอร์ตัวยึดขนาด 1x1 ส่งผลให้ประหยัดหน่วยความจำสำหรับสล็อตที่ถูกล้างทั้งหมด ยกเว้นสล็อตบัฟเฟอร์ที่ใช้งานอยู่ในปัจจุบัน เพื่อให้ได้รับประโยชน์จากการประหยัดหน่วยความจำบางส่วน ให้เปิดใช้งานตัวเลือกที่เข้ากันได้แบบย้อนหลังโดยตั้งค่า surface_flinger.clear_slots_with_set_layer_buffer sysprop เป็น true พบ sysprop นี้ในไฟล์ property_contexts

การตั้งค่า sysprop นี้จำเป็นต้องใช้ Composer HAL ของคุณเพื่อจัดการคำสั่ง setLayerBuffer หลายคำสั่งอย่างถูกต้องสำหรับเลเยอร์เดียวกันในรอบปัจจุบันเดียว

การเปิดใช้งานตัวเลือกที่เข้ากันได้แบบย้อนหลังจะมีผลกระทบดังต่อไปนี้:

  • สำหรับ AIDL HAL: SurfaceFlinger จะส่งอินสแตนซ์ LayerCommand หลายอินสแตนซ์สำหรับเลเยอร์เดียว โดยแต่ละอินสแตนซ์มี BufferCommand เดียว แต่ละ BufferCommand มีตัวจัดการบัฟเฟอร์ตัวยึดตำแหน่ง 1x1 และหมายเลขสล็อตสำหรับสล็อตบัฟเฟอร์แคชที่จำเป็นต้องล้างข้อมูล

  • สำหรับ HIDL HAL: SurfaceFlinger ส่งคำสั่ง SELECT_DISPLAY , SELECT_LAYER , SET_BUFFER หลายคำสั่ง คำสั่งเหล่านี้ประกอบด้วยตัวจัดการบัฟเฟอร์ตัวยึดตำแหน่ง 1x1 และหมายเลขช่องสำหรับช่องบัฟเฟอร์แคชที่จำเป็นต้องล้างข้อมูล

ตัวเลือกที่เข้ากันได้แบบย้อนหลังอาจทำให้ Composer HAL ขัดข้องในอุปกรณ์บางชนิด คุณอาจแก้ไข Composer HAL ของคุณเพื่อแก้ไขปัญหานี้ได้ พบโค้ดที่ควบคุมพฤติกรรมนี้ได้ที่นี่:

ทดสอบการใช้หน่วยความจำแคชบัฟเฟอร์กราฟิก

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

มีการทดสอบ VTS เพื่อตรวจสอบว่าการใช้งาน HAL นั้นสามารถรับการเรียก API ใหม่ (HAL เวอร์ชัน 3.2+) หรือคำสั่ง setLayerBuffer หลายคำสั่งสำหรับการใช้งานที่เข้ากันได้แบบย้อนหลัง อย่างไรก็ตาม สิ่งนี้ไม่ควรถือเป็นการทดสอบที่เพียงพอสำหรับฟังก์ชันการทำงานที่เหมาะสม เนื่องจากอุปกรณ์บางตัวผ่านการทดสอบ VTS เหล่านี้ แต่จะล้มเหลวในกรณีการใช้งานจริง

สำหรับการทดสอบ VTS ใหม่ ให้ไปที่ลิงก์ต่อไปนี้: