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