SurfaceFlinger و WindowManager

SurfaceFlinger بافرها را می‌پذیرد، بافرها را می‌نویسد و بافرها را به صفحه نمایش می‌فرستد. WindowManager بافرها و ابرداده های پنجره را به SurfaceFlinger می دهد که SurfaceFlinger از آنها برای ترکیب سطوح روی نمایشگر استفاده می کند.

سرفیس فلینگر

SurfaceFlinger می تواند به دو طریق بافرها را بپذیرد: از طریق BufferQueue و SurfaceControl یا از طریق ASurfaceControl.

یکی از راه هایی که SurfaceFlinger بافرها را می پذیرد از طریق BufferQueue و SurfaceControl است. هنگامی که یک برنامه در پیش زمینه قرار می گیرد، از WindowManager درخواست بافر می کند. سپس WindowManager یک لایه از SurfaceFlinger درخواست می کند. یک لایه ترکیبی از یک سطح است که حاوی BufferQueue و یک SurfaceControl است که حاوی ابرداده لایه مانند قاب نمایش است. SurfaceFlinger لایه را ایجاد کرده و به WindowManager ارسال می کند. سپس WindowManager سطح را به برنامه می فرستد، اما SurfaceControl را برای دستکاری ظاهر برنامه روی صفحه نگه می دارد.

اندروید 10 ASurfaceControl را اضافه می کند، که راه دیگری است که SurfaceFlinger می تواند بافرها را بپذیرد. ASurfaceControl یک سطح و یک SurfaceControl را در یک بسته تراکنش ترکیب می کند که به SurfaceFlinger ارسال می شود. یک ASurfaceControl با یک لایه مرتبط است که برنامه ها از طریق ASurfaceTransactions به روز می شوند. سپس برنامه‌ها اطلاعات مربوط به ASurfaceTransactions را از طریق تماس‌هایی دریافت می‌کنند که ASurfaceTransactionStats حاوی اطلاعاتی مانند زمان اتصال، زمان‌های دریافت و غیره را ارسال می‌کنند.

جدول زیر شامل جزئیات بیشتر در مورد ASurfaceControl و اجزای مرتبط با آن است.

جزء توضیحات
ASurfaceControl SurfaceControl را می پیچد و یک برنامه را قادر می سازد تا SurfaceControl هایی را ایجاد کند که مطابق با لایه های نمایشگر است.

می تواند به عنوان فرزند ANativeWindow یا فرزند ASurfaceControl دیگری ایجاد شود.
ASurfaceTransaction تراکنش را Wraps می کند تا مشتری را قادر سازد تا ویژگی های توصیفی یک لایه را ویرایش کند، مانند هندسه، و بافرهای به روز شده را به SurfaceFlinger ارسال می کند.
ASurfaceTransactionStats اطلاعات مربوط به تراکنش‌های ارائه‌شده، مانند زمان اتصال، زمان‌های کسب، و حصار انتشار قبلی را از طریق یک تماس از قبل ثبت‌شده به برنامه ارسال می‌کند.

اگرچه برنامه‌ها می‌توانند در هر زمانی بافر ارسال کنند، SurfaceFlinger فقط برای پذیرش بافرها بین بازخوانی‌های نمایشگر بیدار می‌شود، که بسته به دستگاه می‌تواند متفاوت باشد. این کار مصرف حافظه را به حداقل می‌رساند و از پاره شدن قابل مشاهده روی صفحه جلوگیری می‌کند، که ممکن است هنگام به‌روزرسانی صفحه نمایش در اواسط بازخوانی رخ دهد.

هنگامی که نمایشگر بین رفرش قرار دارد، نمایشگر سیگنال VSYNC را به SurfaceFlinger ارسال می کند. سیگنال VSYNC نشان می دهد که صفحه نمایش را می توان بدون پاره شدن تازه کرد. هنگامی که SurfaceFlinger سیگنال VSYNC را دریافت می کند، SurfaceFlinger در لیست لایه های خود به دنبال بافرهای جدید می رود. اگر SurfaceFlinger یک بافر جدید پیدا کند، SurfaceFlinger بافر را بدست می آورد. در غیر این صورت، SurfaceFlinger به استفاده از بافری که قبلا به دست آورده بود، ادامه می دهد. SurfaceFlinger همیشه باید چیزی را نمایش دهد، بنابراین به یک بافر آویزان می شود. اگر هیچ بافری روی یک لایه ارسال نشده باشد، لایه نادیده گرفته می شود.

پس از اینکه SurfaceFlinger تمام بافرهای لایه های قابل مشاهده را جمع آوری کرد، از Hardware Composer (HWC) می پرسد که ترکیب بندی چگونه باید انجام شود. اگر HWC نوع ترکیب لایه را به عنوان ترکیب مشتری علامت گذاری کند، SurfaceFlinger آن لایه ها را ترکیب می کند. سپس SurfaceFlinger بافر خروجی را به HWC ارسال می کند.

WindowManager

WindowManager اشیاء پنجره را کنترل می کند که محفظه هایی برای مشاهده اشیاء هستند. اشیاء پنجره همیشه توسط اشیاء سطحی پشتیبانی می شوند. WindowManager بر چرخه‌های عمر، رویدادهای ورودی و تمرکز، جهت‌گیری صفحه، انتقال‌ها، انیمیشن‌ها، موقعیت، تبدیل‌ها، ترتیب z و بسیاری از جنبه‌های دیگر یک پنجره نظارت می‌کند. WindowManager تمام ابرداده های پنجره را به SurfaceFlinger می فرستد تا SurfaceFlinger بتواند از آن داده ها برای ترکیب سطوح روی نمایشگر استفاده کند.

پیش چرخش

بسیاری از پوشش‌های سخت‌افزاری از چرخش پشتیبانی نمی‌کنند (و حتی اگر این کار را انجام دهند، قدرت پردازش هزینه دارد). راه حل این است که بافر را قبل از رسیدن به SurfaceFlinger تبدیل کنید. Android از یک اشاره پرس و جو ( NATIVE_WINDOW_TRANSFORM_HINT ) در ANativeWindow پشتیبانی می کند تا محتمل ترین تبدیلی را که توسط SurfaceFlinger به بافر اعمال می شود، نشان دهد. درایورهای GL می‌توانند از این راهنمایی برای پیش‌تغییر بافر قبل از رسیدن به SurfaceFlinger استفاده کنند تا وقتی بافر رسید، به درستی تبدیل شود.

به عنوان مثال، هنگام دریافت راهنمایی برای چرخش 90 درجه، یک ماتریس ایجاد و روی بافر اعمال کنید تا از پایان صفحه جلوگیری شود. برای صرفه جویی در مصرف برق، این پیش چرخش را انجام دهید. برای جزئیات، به رابط ANativeWindow تعریف شده در system/core/include/system/window.h مراجعه کنید.