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

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

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

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

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

    ในระหว่างกิจกรรม HotPlug มีการใช้แฮนเดิลของ FrameBuffers เก่า เมื่อมีการจัดการดีลข้อมูลดิสเพลย์เดิม

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

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

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

  • สำหรับเหตุการณ์เกี่ยวกับปลั๊กไฟ ให้ทันทีก่อนเรียกใช้ onHotplug

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

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

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

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

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

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

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

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

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

  • สำหรับกิจกรรมปลั๊กไฟ เพียงถอดปลั๊กและเชื่อมต่อจอแสดงผลที่ต่างกัน 2 จออีกครั้ง ความละเอียดต่างๆ ได้

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