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