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

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

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

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

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

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

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

  • LatchUnsignaledConfig::AutoSingleLayer

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

  • LatchUnsignaledConfig::Disabled

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

  • LatchUnsignaledConfig::Always

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

ทดสอบ AutoSingleLayer

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

ร่องรอยของบัฟเฟอร์ที่ไม่มีสัญญาณที่ล็อคไว้

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