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

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