การล็อกบัฟเฟอร์แบบไม่ส่งสัญญาณด้วย AutoSingleLayer

Android 13 เปิดตัวการกำหนดค่าใหม่ที่ชื่อ AutoSingleLayer สำหรับการล็อกบัฟเฟอร์ที่ไม่มีการส่งสัญญาณ การกำหนดค่านี้ช่วยให้ SurfaceFlinger ล็อกบัฟเฟอร์ที่ไม่มีการส่งสัญญาณได้เมื่อมีการอัปเดตเลเยอร์เดียวเท่านั้น โดยจะไม่มีผลกับกรณีที่เกิดขึ้นในเลเยอร์ต่างๆ เช่น การเปลี่ยนแปลงเรขาคณิต หรือธุรกรรมการซิงค์

ก่อนหน้านี้ debug.sf.latch_unsignaled ในโปรเจ็กต์ Android Open Source (AOSP) อนุญาตให้ SurfaceFlinger ล็อกบัฟเฟอร์ที่ไม่มีการส่งสัญญาณทั้งหมด ไม่ว่าจะเป็น กรณีการใช้งานใดก็ตาม เมื่อเปิดใช้การกำหนดค่านี้ อาจทำให้เกิดผลข้างเคียงที่ไม่พึงประสงค์ เช่น การหยุดธุรกรรมการซิงค์และการหยุดแสดงผลทั้งหมดชั่วคราวขณะรอให้บัฟเฟอร์ที่ไม่สมบูรณ์

ในโหมด AutoSingleLayer SurfaceFlinger จะอัปเดตเฉพาะบัฟเฟอร์ของ Surface เดียวในเฟรม โหมดนี้ช่วยให้เกมและแอปอื่นๆ แบบเต็มหน้าจอได้รับประโยชน์จาก การล็อกบัฟเฟอร์ที่ไม่มีการส่งสัญญาณและการลดการกระตุกของแอปโดยไม่ได้รับผลกระทบจาก การค้างของจอแสดงผล

การตั้งค่าโหมด AutoSingleLayer

สำหรับ Android 13 AutoSingleLayer เป็นค่าเริ่มต้น สำหรับฟีเจอร์บัฟเฟอร์ที่ไม่ได้ส่งสัญญาณของ Latch โหมดนี้ควบคุมโดย พร็อพเพอร์ตี้ของระบบ debug.sf.auto_latch_unsignaled

SurfaceFlinger จะอ่าน LatchUnsignaledConfig เมื่อบูต การกำหนดค่าที่เป็นไปได้มีดังนี้

  • LatchUnsignaledConfig::AutoSingleLayer

    ในโหมดเริ่มต้นของ AOSP นี้ SurfaceFlinger จะอนุญาตให้ตรึงบัฟเฟอร์ที่ไม่มีการส่งสัญญาณ เมื่อเลเยอร์เดียวอัปเดตในเฟรม การอัปเดตต้องมีเฉพาะ การอัปเดตบัฟเฟอร์ที่ไม่มีธุรกรรมการซิงค์หรือการเปลี่ยนแปลงเรขาคณิต โดยค่าเริ่มต้น โหมดนี้จะตั้งค่า debug.sf.auto_latch_unsignaled เป็น true

  • LatchUnsignaledConfig::Disabled

    โหมดนี้จะปิดใช้ลักษณะการทำงานของ Latch ที่ไม่มีการส่งสัญญาณและจะ Latch เฉพาะธุรกรรมที่มีการส่งสัญญาณ เท่านั้น โหมดนี้จะปิดใช้โหมด AutoSingleLayer ด้วย หากต้องการกำหนดค่า โหมดนี้ ให้ตั้งค่า debug.sf.latch_unsignaled และ debug.sf.auto_latch_unsignaled เป็น false

  • LatchUnsignaledConfig::Always

    ในโหมดนี้ SurfaceFlinger จะล็อกบัฟเฟอร์ทั้งหมดที่ไม่ได้ส่งสัญญาณ หากต้องการกำหนดค่า โหมดนี้ ให้ตั้งค่า debug.sf.latch_unsignaled เป็น true

ทดสอบ AutoSingleLayer

หากต้องการทดสอบว่าบัฟเฟอร์ล็อกโดยไม่มีการส่งสัญญาณหรือไม่ ให้มองหาร่องรอยต่อไปนี้ จาก SurfaceFlinger ใน Perfetto

การติดตามบัฟเฟอร์ที่ล็อกซึ่งไม่มีการส่งสัญญาณ

รูปที่ 1 ร่องรอยของบัฟเฟอร์ที่ล็อกไว้ซึ่งไม่มีการส่งสัญญาณใน Perfetto