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

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

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

ใช้ Composer HAL 3.2 API

หากต้องการรับสิทธิประโยชน์ด้านหน่วยความจำบัฟเฟอร์กราฟิกอย่างเต็มที่ คุณต้องมีคุณสมบัติดังนี้

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

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

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

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

การตั้งค่า Sysprop นี้กำหนดให้การใช้งาน HAL ของ Composer ต้องจัดการคำสั่ง setLayerBuffer หลายรายการสำหรับเลเยอร์เดียวกันในรอบการนำเสนอเดียวได้อย่างถูกต้อง

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

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

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

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

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

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

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

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