ตั้งแต่ Android 13, Framebuffers ใหม่ที่ใช้ระหว่าง ลูกค้า องค์ประกอบจะถูกจัดสรรเมื่อความละเอียดในการแสดงมีการเปลี่ยนแปลง ช่วงเวลานี้ แพลตฟอร์มจะดำเนินการจัดสรรโดย SurfaceFlinger ในรอบที่ไม่ถูกต้องถัดไป หลังเปลี่ยนความละเอียด
การจัดการเฟรมบัฟเฟอร์ในระหว่างการเปลี่ยนความละเอียด
การเปลี่ยนแปลงความละเอียดเกิดขึ้นเนื่องจากสาเหตุข้อใดข้อหนึ่งต่อไปนี้ 2 สถานการณ์ ได้แก่
กิจกรรมปลั๊กไฟ เริ่มต้นโดย Hardware Composer (HWC) ซึ่งจะเกิดขึ้นเมื่อสลับจากภายนอก 1 รายการ ไปยังจอแสดงผลภายนอกเครื่องอื่นที่มีความละเอียดเริ่มต้นแตกต่างกัน
ในระหว่างกิจกรรม HotPlug มีการใช้แฮนเดิลของ FrameBuffers เก่า เมื่อมีการจัดการดีลข้อมูลดิสเพลย์เดิม
สวิตช์โหมดการแสดงผลซึ่งเริ่มต้นโดย SurfaceFlinger ซึ่งจะเกิดขึ้นเมื่อ ผู้ใช้เปลี่ยนความละเอียดตามการตั้งค่าผู้ใช้ หรือแอปเปลี่ยนความละเอียดด้วย
preferredDisplayModeId
ระหว่างการเปลี่ยนโหมดการแสดงผล แฮนเดิลไปยังเฟรมบัฟเฟอร์ของไคลเอ็นต์ที่มีอยู่ เผยแพร่โดย SurfaceFlinger ก่อนที่จะเรียกใช้
setActiveConfig
หรือsetActiveConfigWithConstraints
เพื่อหลีกเลี่ยงปัญหาร้ายแรง เช่น การกระจายหน่วยความจำในอุปกรณ์ที่ ไม่มีหน่วยความจำเพียงพอสำหรับ FrameBuffers ทั้งเก่าและใหม่ มันสำคัญมาก HWC เลิกใช้ FrameBuffers แบบเก่าและเปิดตัว จัดการเฟรมบัฟเฟอร์เหล่านี้ตามที่แสดงในกรณีต่อไปนี้
สำหรับเหตุการณ์เกี่ยวกับปลั๊กไฟ ให้ทันทีก่อนเรียกใช้
onHotplug
สําหรับการเปลี่ยนโหมด ทันทีหลังจากที่โทรหา
setActiveConfig
หรือsetActiveConfigWithConstraints
การปล่อยที่จับจะช่วยให้จัดการหน่วยความจำ Framebuffer ได้อย่างสมบูรณ์ ก่อนการจัดสรร Framebuffer ใหม่ที่ SurfaceFlinger ดำเนินการ ในรอบการทำข้อมูลที่ไม่ถูกต้องถัดไป
คําแนะนําสำหรับการจัดการเฟรมบัฟเฟอร์
หาก HWC ไม่ปล่อยแฮนเดิลให้กับ FrameBuffers เก่าทันเวลา การจัดสรร Framebuffer ใหม่เกิดขึ้นก่อน Framebuffer ตัวเก่า ตำแหน่งการซื้อขาย ซึ่งอาจทำให้เกิดปัญหาร้ายแรงเมื่อจัดสรรใหม่ไม่สำเร็จ เนื่องจากการกระจาย Fragment หรือปัญหาอื่นๆ และยิ่งไปกว่านั้น หาก HWC ไม่ปล่อยแฮนเดิลเหล่านี้เลย หน่วยความจำรั่วอาจทำให้ เกิดขึ้น
โปรดทำตามคำแนะนำต่อไปนี้เพื่อหลีกเลี่ยงความล้มเหลวในการจัดสรรที่ส่งผลกระทบอย่างมาก
หาก HWC ต้องใช้ FrameBuffers ของไคลเอ็นต์เดิมต่อไปจนกว่า มีเฟรมบัฟเฟอร์ของไคลเอ็นต์อยู่แล้ว จึงต้องสำรองหน่วยความจำให้เพียงพอ สำหรับทั้งเฟรมบัฟเฟอร์เก่าและใหม่ และอาจเรียกใช้การจัดเรียงข้อมูลบนเฟรม บนพื้นที่หน่วยความจำของเฟรมบัฟเฟอร์
จัดสรรพูลหน่วยความจำเฉพาะสำหรับเฟรมบัฟเฟอร์ที่แยกต่างหากจาก หน่วยความจำบัฟเฟอร์กราฟิกที่เหลือ ซึ่งเป็นสิ่งสำคัญเนื่องจาก การหาดีลและการจัดสรรเฟรมซ้ำ กระบวนการของบุคคลที่สามสามารถช่วยได้ พยายามจัดสรรหน่วยความจำกราฟิก หากกลุ่มหน่วยความจำกราฟิกเดียวกันคือ เฟรมบัฟเฟอร์ และหากหน่วยความจำกราฟิกเต็ม อาจใช้หน่วยความจำกราฟิกที่ Framebuffer จัดสรรไว้ก่อนหน้านี้ได้ ทำให้เหลือหน่วยความจำไม่เพียงพอสำหรับการจัดสรรเฟรมบัฟเฟอร์ใหม่ หรือ การกระจายพื้นที่หน่วยความจำ
ทดสอบการจัดการเฟรมบัฟเฟอร์
OEM ควรทดสอบการจัดการหน่วยความจำเฟรมบัฟเฟอร์ของลูกค้าอย่างเหมาะสม สวิตช์ความละเอียดของอุปกรณ์ ดังต่อไปนี้
สำหรับกิจกรรมปลั๊กไฟ เพียงถอดปลั๊กและเชื่อมต่อจอแสดงผลที่ต่างกัน 2 จออีกครั้ง ความละเอียดต่างๆ ได้
สำหรับสวิตช์โหมด ให้ใช้
ModeSwitchingTestActivity
CTS การทดสอบ Verifier เพื่อเริ่มสวิตช์โหมดสำหรับการทดสอบการทำงานของหน่วยความจำของเฟรมบัฟเฟอร์ การทดสอบนี้จะระบุปัญหาที่ตรวจพบได้ยาก แบบเป็นโปรแกรม