قفل بافر بدون علامت با AutoSingleLayer

اندروید ۱۳ پیکربندی جدیدی به نام 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