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

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

การจัดการเฟรมบัฟเฟอร์ระหว่างการเปลี่ยนความละเอียด

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

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

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

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

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

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

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

  • สำหรับการเปลี่ยนโหมด ให้เรียก setActiveConfig หรือ setActiveConfigWithConstraints ทันทีหลังจาก

การปล่อยแฮนเดิลจะช่วยให้ระบบยกเลิกการจัดสรรหน่วยความจำเฟรมบัฟเฟอร์ได้อย่างสมบูรณ์ก่อนที่ SurfaceFlinger จะจัดสรรเฟรมบัฟเฟอร์ใหม่ในรอบ invalidate ถัดไป

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

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

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

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

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

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

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

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

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