اندروید ۱۳ پیکربندی جدیدی به نام AutoSingleLayer
را برای قفل کردن بافرهای بدون سیگنال معرفی میکند. این پیکربندی به SurfaceFlinger اجازه میدهد تا زمانی که فقط یک لایه در حال بهروزرسانی است، یک بافر بدون سیگنال را قفل کند. این مورد در مواردی که بین لایهها رخ میدهد، مانند تغییرات هندسی یا تراکنشهای همگامسازی، صدق نمیکند.
پیش از این، پرچم debug.sf.latch_unsignaled
در پروژه متنباز اندروید (AOSP) به SurfaceFlinger اجازه میداد تا صرف نظر از مورد استفاده، تمام بافرهای بدون سیگنال را قفل کند. هنگامی که این پیکربندی را فعال میکنید، میتواند عوارض جانبی نامطلوبی ایجاد کند، به عنوان مثال، قطع تراکنشهای همگامسازی و فریز شدن کل صفحه نمایش در حین انتظار برای بافرهای ناقص.
در حالت AutoSingleLayer
، SurfaceFlinger فقط یک بافر از یک سطح واحد در یک فریم را بهروزرسانی میکند. این حالت به بازیها و سایر برنامههای تمام صفحه اجازه میدهد تا از بافرهای بدون سیگنال بهره ببرند و لرزش برنامه را کاهش دهند، در حالی که تحت تأثیر هنگ کردن صفحه نمایش قرار نمیگیرند.
تنظیمات حالت AutoSingleLayer
برای اندروید ۱۳، AutoSingleLayer
حالت پیشفرض برای ویژگی latch unsignaled buffer است. این حالت توسط ویژگی سیستمی 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
تنظیم کنید.
تست تکلایه خودکار
برای بررسی اینکه آیا یک بافر بدون سیگنال قفل شده است یا خیر، به دنبال ردپاهای زیر از SurfaceFlinger در Perfetto باشید:
شکل ۱. رد یک بافر قفلشده بدون سیگنال در Perfetto