การจัดการเฟรมบัฟเฟอร์ของลูกค้า

ตั้งแต่ 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 การทดสอบนี้สามารถระบุปัญหาที่ตรวจจับได้ยากทางโปรแกรม