قفل کردن میان‌گیر بدون علامت با AutoSingleLayer

‫Android 13 پیکربندی جدیدی به نام AutoSingleLayer برای چفت کردن بافرهای بدون سیگنال معرفی می‌کند. این پیکربندی به SurfaceFlinger اجازه می‌دهد وقتی فقط یک لایه درحال به‌روزرسانی است، بافر بدون سیگنال را قفل کند. این مورد برای مواردی که در لایه‌های مختلف رخ می‌دهد، برای مثال، تغییرات هندسی یا تراکنش‌های همگام‌سازی، اعمال نمی‌شود.

قبلاً، پرچم debug.sf.latch_unsignaled در «پروژه منبع باز Android»‏ (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 جستجو کنید:

ردیابی بافر بدون سیگنال

شکل ۱. ردیابی بافر بدون سیگنال قفل‌شده در Perfetto