ในสแต็กกราฟิก แคชบัฟเฟอร์ต่อเลเยอร์จะอยู่ระหว่าง 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
เพื่อให้ได้รับประโยชน์จากหน่วยความจำบัฟเฟอร์กราฟิกเต็มรูปแบบ คุณต้อง:
- อัปเดตการใช้งาน Composer HAL ของคุณเป็นเวอร์ชัน 3.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 ใหม่ ให้ไปที่ลิงก์ต่อไปนี้:
รองรับ HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
เข้ากันได้กับ AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear