ในสแต็กกราฟิก แคชบัฟเฟอร์ต่อเลเยอร์จะอยู่ระหว่าง 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 ขัดข้องในอุปกรณ์บางรุ่น คุณอาจแก้ไข Composer HAL เพื่อแก้ปัญหานี้ได้ คุณดู โค้ดที่ควบคุมลักษณะการทำงานนี้ได้ที่นี่
ทดสอบการใช้หน่วยความจำแคชบัฟเฟอร์กราฟิก
การทดสอบไม่สามารถยืนยันได้ว่าการใช้งาน HAL ล้างข้อมูลในช่องแคชหรือไม่ อย่างไรก็ตาม คุณสามารถใช้เครื่องมือแก้ไขข้อบกพร่องเพื่อตรวจสอบการใช้บัฟเฟอร์กราฟิกได้ ขณะตรวจสอบ คุณอาจสังเกตเห็นข้อผิดพลาดหน่วยความจำไม่พอในสถานการณ์ที่ มีการหยุดและเริ่มวิดีโอหลายรายการที่แตกต่างกันอย่างรวดเร็วบน YouTube น้อยลง
การทดสอบ VTS พร้อมใช้งานเพื่อยืนยันว่าการใช้งาน HAL มีความสามารถในการรับการเรียก API ใหม่ (HAL เวอร์ชัน 3.2 ขึ้นไป) หรือคำสั่ง setLayerBuffer หลายรายการสำหรับการใช้งานที่เข้ากันได้แบบย้อนหลัง อย่างไรก็ตาม การทดสอบนี้ไม่ควรถือว่าเพียงพอสำหรับการทดสอบฟังก์ชันการทำงานที่เหมาะสม เนื่องจากอุปกรณ์บางเครื่องผ่านการทดสอบ VTS เหล่านี้ แต่ไม่ผ่านในกรณีการใช้งานจริง
สําหรับการทดสอบ VTS ใหม่ โปรดดูลิงก์ต่อไปนี้