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

ตั้งแต่ Android 13 เป็นต้นไป ระบบจะจัดสรรเฟรมบัฟเฟอร์ใหม่ที่ใช้ในระหว่างการคอมโพสิตฝั่งไคลเอ็นต์ ทุกครั้งที่ความละเอียดของจอแสดงผลเปลี่ยนแปลง SurfaceFlinger จะทำการ จัดสรรนี้ในรอบการลบล้างถัดไป หลังจากเปลี่ยนความละเอียด

การจัดการ Framebuffer ระหว่างการสลับความละเอียด

การเปลี่ยนแปลงความละเอียดเกิดขึ้นจากสถานการณ์ใดสถานการณ์หนึ่งต่อไปนี้

  • เหตุการณ์ Hotplug ที่เริ่มต้นโดย Hardware Composer (HWC) ซึ่งเกิดขึ้นเมื่อสลับจากจอแสดงผลภายนอกหนึ่ง ไปยังจอแสดงผลภายนอกอื่นที่มีความละเอียดเริ่มต้นแตกต่างกัน

    ในระหว่างเหตุการณ์ Hotplug ระบบจะปล่อยแฮนเดิลไปยังเฟรมบัฟเฟอร์เก่าเมื่อยกเลิกการจัดสรรข้อมูลการแสดงผลเก่า

  • การสลับโหมดการแสดงผลที่เริ่มต้นโดย SurfaceFlinger ซึ่งจะเกิดขึ้นเมื่อ ผู้ใช้เปลี่ยนความละเอียดด้วยการตั้งค่าของผู้ใช้ หรือแอปเปลี่ยนความละเอียดด้วย preferredDisplayModeId

    ในระหว่างการสลับโหมดการแสดงผล SurfaceFlinger จะปล่อยแฮนเดิลไปยัง Framebuffer ของไคลเอ็นต์ที่มีอยู่ ก่อนที่จะเรียก setActiveConfig หรือ setActiveConfigWithConstraints

เพื่อหลีกเลี่ยงปัญหาที่ร้ายแรง เช่น หน่วยความจำกระจัดกระจาย ในอุปกรณ์ที่ ไม่ได้จองหน่วยความจำสำหรับเฟรมบัฟเฟอร์เก่าและใหม่ให้เพียงพอ จึงเป็นสิ่งสำคัญ ที่ HWC จะต้องหยุดใช้เฟรมบัฟเฟอร์เก่าและปล่อยแฮนเดิล ไปยังเฟรมบัฟเฟอร์เหล่านี้ตามที่แสดงในกรณีต่อไปนี้

  • สำหรับเหตุการณ์ Hotplug ให้เรียกใช้ onHotplug ทันทีก่อน

  • สำหรับการสลับโหมด ให้โทรหา setActiveConfig หรือ setActiveConfigWithConstraints ทันที

การปล่อยแฮนเดิลจะช่วยให้ระบบยกเลิกการจัดสรรหน่วยความจำของ Framebuffer ได้อย่างเต็มที่ ก่อนที่จะจัดสรร Framebuffer ใหม่ที่ SurfaceFlinger ดำเนินการ ในรอบการลบล้างครั้งถัดไป

คำแนะนำสำหรับการจัดการเฟรมบัฟเฟอร์

หาก HWC ไม่ปล่อยแฮนเดิลไปยัง Framebuffer เก่าตามเวลาที่กำหนด การจัดสรร Framebuffer ใหม่จะเกิดขึ้นก่อนการ เลิกจัดสรร Framebuffer เก่า ซึ่งอาจทำให้เกิดปัญหาใหญ่เมื่อการจัดสรรใหม่ล้มเหลว เนื่องจากมีการกระจายข้อมูลหรือปัญหาอื่นๆ ที่แย่กว่านั้นคือหาก HWC ไม่ปล่อยแฮนเดิลเหล่านี้เลย ก็อาจเกิดหน่วยความจำรั่วได้

โปรดทำตามคำแนะนำต่อไปนี้เพื่อหลีกเลี่ยงการจัดสรรที่ล้มเหลวซึ่งก่อให้เกิดความเสียหายอย่างมาก

  • หาก HWC ต้องใช้เฟรมบัฟเฟอร์ไคลเอ็นต์เก่าต่อไปจนกว่าจะได้รับเฟรมบัฟเฟอร์ไคลเอ็นต์ใหม่ คุณจะต้องจองหน่วยความจำให้เพียงพอสำหรับทั้งเฟรมบัฟเฟอร์เก่าและใหม่ และอาจต้องเรียกใช้อัลกอริทึมการจัดเรียงข้อมูลใหม่ในพื้นที่หน่วยความจำของเฟรมบัฟเฟอร์

  • จัดสรรพูลหน่วยความจำเฉพาะสำหรับเฟรมบัฟเฟอร์ที่แยกจาก หน่วยความจำบัฟเฟอร์กราฟิกที่เหลือ ซึ่งเป็นสิ่งสำคัญเนื่องจากระหว่างการเลิกจัดสรรและการจัดสรรใหม่ของเฟรมบัฟเฟอร์ กระบวนการของบุคคลที่สามอาจพยายามจัดสรรหน่วยความจำกราฟิก หากมีการใช้พูลหน่วยความจำกราฟิกเดียวกันโดย Framebuffer และหากหน่วยความจำกราฟิกเต็ม กระบวนการของบุคคลที่สามจะใช้หน่วยความจำกราฟิกที่ Framebuffer จัดสรรไว้ก่อนหน้านี้ได้ ซึ่งจะทำให้มีหน่วยความจำไม่เพียงพอสำหรับการจัดสรร Framebuffer ใหม่ หรืออาจทำให้พื้นที่หน่วยความจำกระจัดกระจาย

ทดสอบการจัดการเฟรมบัฟเฟอร์

เราขอแนะนำให้ OEM ทดสอบการจัดการหน่วยความจำของเฟรมบัฟเฟอร์ไคลเอ็นต์อย่างเหมาะสมเมื่อมีการสลับความละเอียดของอุปกรณ์ โดยมีรายละเอียดดังนี้

  • สำหรับเหตุการณ์การเสียบและถอดปลั๊ก ให้ถอดปลั๊กและเชื่อมต่อจอแสดงผล 2 จอที่แตกต่างกันอีกครั้งโดยใช้ ความละเอียดที่แตกต่างกัน

  • สําหรับการสลับโหมด ให้ใช้การทดสอบ ModeSwitchingTestActivity CTS Verifier เพื่อเริ่มการสลับโหมดสําหรับทดสอบลักษณะการทํางานของหน่วยความจําของเฟรมบัฟเฟอร์ การทดสอบนี้จะช่วยระบุปัญหาที่ตรวจจับได้ยาก โดยใช้โปรแกรม