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

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

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

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

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

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

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

  • LatchUnsignaledConfig::AutoSingleLayer

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

  • LatchUnsignaledConfig::Disabled

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

  • LatchUnsignaledConfig::Always

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

ทดสอบ AutoSingleLayer

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

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

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