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