ในสแต็กกราฟิก แคชบัฟเฟอร์ต่อเลเยอร์จะอยู่ระหว่าง Composer HAL กับ
SurfaceFlinger เพื่อลดค่าใช้จ่ายที่เกี่ยวข้องกับการส่งตัวอธิบายไฟล์
ผ่าน IPC ก่อน Android 14 ระบบ
ไม่ได้ล้างแคชบัฟเฟอร์นี้เมื่อ
GraphicBufferProducer
ยกเลิกการเชื่อมต่อจาก
GraphicBufferConsumer
ของ SurfaceFlinger เช่น เมื่อ 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
หากต้องการรับสิทธิประโยชน์ด้านหน่วยความจำบัฟเฟอร์กราฟิกอย่างเต็มที่ คุณต้องมีคุณสมบัติดังนี้
- อัปเดตการติดตั้งใช้งาน HAL ของ Composer เป็นเวอร์ชัน 3.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 ใหม่ โปรดดูลิงก์ต่อไปนี้