การจัดการเฟรมบัฟเฟอร์ไคลเอ็นต์

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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