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