ในสแต็กกราฟิก แคชบัฟเฟอร์ต่อเลเยอร์จะอยู่ระหว่าง Composer HAL และ SurfaceFlinger เพื่อลดค่าใช้จ่ายที่เกี่ยวข้องกับการส่งข้อบ่งชี้ไฟล์ผ่าน IPC ก่อน Android 14 ระบบจะไม่ล้างแคชบัฟเฟอร์นี้เมื่อ GraphicBufferProducer
ยกเลิกการเชื่อมต่อจาก SurfaceFlingerGraphicBufferConsumer
เช่น เมื่อ MediaCodec ยกเลิกการเชื่อมต่อจาก SurfaceView ตั้งแต่ Android 14 เป็นต้นไป คุณสามารถล้างแคชบัฟเฟอร์นี้ออกได้เพื่อลดการใช้หน่วยความจำกราฟิก
เลือกจาก 2 ตัวเลือกต่อไปนี้
- สำหรับอุปกรณ์ที่เปิดตัวด้วย Android 14 ขึ้นไป คุณต้องใช้ Composer HAL API เวอร์ชัน 3.2 ใหม่ ตัวเลือกนี้จะเปิดใช้งานโดยค่าเริ่มต้นและประหยัดหน่วยความจำได้มากที่สุด อุปกรณ์ที่อัปเกรดเป็น Android 14 ขึ้นไปจะใช้ตัวเลือกนี้เพื่อรับประโยชน์จากหน่วยความจำได้อย่างเต็มที่เช่นกัน
- สำหรับอุปกรณ์ที่อัปเกรดเป็น Android 14 ที่ไม่ต้องการใช้ Composer HAL 3.2 API คุณจะเปิดใช้ตัวเลือกที่เข้ากันได้แบบย้อนหลังได้ ตัวเลือกนี้จะประหยัดหน่วยความจําได้เกือบเท่ากับตัวเลือกก่อนหน้า
ส่วนต่อไปนี้จะอธิบายวิธีใช้แต่ละตัวเลือก
ใช้ Composer HAL 3.2 API
หากต้องการรับประโยชน์จากหน่วยความจำบัฟเฟอร์กราฟิกอย่างเต็มรูปแบบ คุณต้องมีคุณสมบัติดังนี้
- อัปเดตการใช้งาน Composer HAL เป็นเวอร์ชัน 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
หลายรายการสำหรับเลเยอร์เดียวกันในรอบการแสดงผลเดียวอย่างถูกต้อง
การเปิดใช้ตัวเลือกที่เข้ากันได้แบบย้อนหลังจะมีผลกระทบดังต่อไปนี้
สำหรับ HAL ของ AIDL: SurfaceFlinger จะส่งอินสแตนซ์
LayerCommand
หลายรายการสำหรับเลเยอร์เดียว โดยแต่ละรายการจะมีBufferCommand
รายการเดียวBufferCommand
แต่ละรายการประกอบด้วยแฮนเดิลบัฟเฟอร์ตัวยึดตำแหน่ง 1x1 และหมายเลขช่องสำหรับช่องบัฟเฟอร์แคชที่ต้องล้างสำหรับ HAL ของ HIDL: SurfaceFlinger จะส่งคําสั่ง
SELECT_DISPLAY
,SELECT_LAYER
,SET_BUFFER
หลายรายการ คำสั่งเหล่านี้มีตัวแฮนเดิลบัฟเฟอร์ตัวยึดตำแหน่ง 1x1 และหมายเลขช่องสำหรับช่องบัฟเฟอร์แคชที่ต้องล้าง
ตัวเลือกที่เข้ากันได้แบบย้อนหลังอาจทําให้ HAL ของ Composer ขัดข้องในอุปกรณ์บางรุ่น คุณอาจแก้ไข HAL ของ Composer เพื่อแก้ปัญหานี้ได้ โค้ดที่ควบคุมลักษณะการทำงานนี้มีอยู่ที่นี่
ทดสอบการใช้หน่วยความจำแคชบัฟเฟอร์กราฟิก
การทดสอบไม่สามารถยืนยันได้ว่าการใช้งาน HAL ล้างข้อมูลในช่องแคชหรือไม่ อย่างไรก็ตาม คุณสามารถใช้เครื่องมือแก้ไขข้อบกพร่องเพื่อตรวจสอบ การใช้งานบัฟเฟอร์กราฟิก ขณะตรวจสอบ คุณควรสังเกตเห็นว่าข้อผิดพลาดเกี่ยวกับหน่วยความจำไม่เพียงพอจะลดลงในสถานการณ์ที่วิดีโอหลายรายการหยุดและเริ่มเล่นบน YouTube ติดต่อกันอย่างรวดเร็ว
การทดสอบ VTS พร้อมใช้งานเพื่อยืนยันว่าการใช้งาน HAL สามารถรับการเรียก API ใหม่ (HAL เวอร์ชัน 3.2 ขึ้นไป) หรือคำสั่ง setLayerBuffer
หลายรายการสําหรับการใช้งานที่เข้ากันได้แบบย้อนหลัง อย่างไรก็ตาม วิธีนี้ก็ไม่ถือว่าเป็นการทดสอบที่เพียงพอสำหรับฟังก์ชันการทำงานที่เหมาะสม เนื่องจากอุปกรณ์บางรุ่นผ่านการทดสอบ VTS เหล่านี้ แต่ล้มเหลวในระหว่างกรณีการใช้งานจริง
สำหรับการทดสอบ VTS ใหม่ ให้ไปที่ลิงก์ต่อไปนี้
เข้ากันได้กับ HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
เข้ากันได้กับ AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear