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