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

ตั้งแต่ 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 เพื่อเริ่มการสลับโหมดสําหรับทดสอบลักษณะการทํางานของหน่วยความจําของเฟรมบัฟเฟอร์ การทดสอบนี้จะช่วยระบุปัญหาที่ตรวจจับได้ยากโดยอัตโนมัติ