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
با لایه ای مرتبط است که برنامه ها از طریق نمونه های ASurfaceTransaction
به روز می شوند. سپس برنامهها اطلاعات مربوط به نمونههای ASurfaceTransaction
را از طریق تماسهایی دریافت میکنند که ASurfaceTransactionStats
حاوی اطلاعاتی مانند زمان قفل، زمانهای دریافت و غیره را ارسال میکنند.
جدول زیر شامل جزئیات بیشتر در مورد ASurfaceControl
و اجزای مرتبط با آن است:
جزء | توضیحات |
---|---|
ASurfaceControl | SurfaceControl را می پیچد و یک برنامه را قادر می سازد تا نمونه هایی از SurfaceControl ایجاد کند که مطابق با لایه های نمایشگر هستند.می تواند به عنوان فرزند ANativeWindow یا فرزند نمونه دیگری از ASurfaceControl ایجاد شود. |
ASurfaceTransaction | Transaction Wraps می کند تا مشتری را قادر سازد تا ویژگی های توصیفی یک لایه را ویرایش کند، مانند هندسه، و بافرهای به روز شده را به SurfaceFlinger ارسال می کند. |
ASurfaceTransactionStats اطلاعات مربوط به تراکنشهای ارائهشده، مانند زمان اتصال، زمانهای کسب، و حصار انتشار قبلی را از طریق یک تماس از قبل ثبتشده به برنامه ارسال میکند. |
اگرچه برنامهها میتوانند در هر زمانی بافر ارسال کنند، SurfaceFlinger فقط برای پذیرش بافرها بین بازخوانیهای نمایشگر بیدار میشود، که بسته به دستگاه میتواند متفاوت باشد. این کار مصرف حافظه را به حداقل میرساند و از پاره شدن قابل مشاهده روی صفحه جلوگیری میکند، که ممکن است هنگام بهروزرسانی صفحه نمایش در اواسط بازخوانی رخ دهد.
هنگامی که نمایشگر بین رفرش است، نمایشگر سیگنال VSync را به SurfaceFlinger ارسال می کند. سیگنال VSync نشان می دهد که صفحه نمایش را می توان بدون پاره شدن تازه کرد. هنگامی که SurfaceFlinger سیگنال VSync را دریافت می کند، SurfaceFlinger در لیست لایه های خود به دنبال بافرهای جدید می رود. اگر SurfaceFlinger یک بافر جدید پیدا کند، SurfaceFlinger بافر را بدست می آورد. در غیر این صورت، SurfaceFlinger به استفاده از بافری که قبلا به دست آورده بود، ادامه می دهد. SurfaceFlinger همیشه باید چیزی را نمایش دهد، بنابراین به یک بافر آویزان می شود. اگر هیچ بافری روی یک لایه ارسال نشده باشد، لایه نادیده گرفته می شود.
پس از اینکه SurfaceFlinger تمام بافرهای لایه های قابل مشاهده را جمع آوری کرد، از Hardware Composer (HWC) می پرسد که ترکیب بندی چگونه باید انجام شود. اگر HWC نوع ترکیب لایه را به عنوان ترکیب مشتری علامت گذاری کند، SurfaceFlinger آن لایه ها را ترکیب می کند. سپس SurfaceFlinger بافر خروجی را به HWC ارسال می کند.
WindowManager
WindowManager
اشیاء Window
را کنترل می کند که محفظه هایی برای View
اشیاء هستند. اشیاء Window
همیشه توسط آبجکت های Surface
پشتیبانی می شوند. WindowManager
بر چرخههای عمر، رویدادهای ورودی و تمرکز، جهتگیری صفحه، انتقالها، انیمیشنها، موقعیت، تبدیلها، ترتیب z و بسیاری از جنبههای دیگر یک پنجره نظارت میکند. WindowManager
تمام ابرداده های پنجره را به SurfaceFlinger می فرستد تا SurfaceFlinger بتواند از آن داده ها برای ترکیب سطوح روی نمایشگر استفاده کند.
پیش چرخش
بسیاری از پوششهای سختافزاری از چرخش پشتیبانی نمیکنند (و حتی اگر این کار را انجام دهند، قدرت پردازش هزینه دارد). راه حل این است که بافر را قبل از رسیدن به SurfaceFlinger تبدیل کنید. Android از یک اشاره پرس و جو ( NATIVE_WINDOW_TRANSFORM_HINT
) در ANativeWindow
پشتیبانی می کند تا محتمل ترین تبدیلی را که توسط SurfaceFlinger به بافر اعمال می شود، نشان دهد. درایورهای GL میتوانند از این راهنمایی برای پیشتغییر بافر قبل از رسیدن به SurfaceFlinger استفاده کنند تا وقتی بافر رسید، به درستی تبدیل شود.
به عنوان مثال، هنگام دریافت راهنمایی برای چرخش 90 درجه، یک ماتریس ایجاد و روی بافر اعمال کنید تا از پایان صفحه جلوگیری شود. برای صرفه جویی در مصرف برق، این پیش چرخش را انجام دهید. برای جزئیات، به رابط ANativeWindow
تعریف شده در system/core/include/system/window.h
مراجعه کنید.