لایه‌ها و نمایشگرها

لایه‌ها و نمایشگرها دو عنصر اولیه هستند که کار ترکیب و تعامل با سخت‌افزار نمایشگر را نشان می‌دهند.

لایه‌ها

لایه مهم‌ترین واحد ترکیب است. لایه ترکیبی از سطح و نمونه‌ای از SurfaceControl است. هر لایه مجموعه‌ای از ویژگی‌ها دارد که نحوه تعامل آن با لایه‌های دیگر را تعریف می‌کند. ویژگی‌های لایه در جدول زیر شرح داده شده است:

دارایی شرح
موقعیت‌محور تعیین می‌کند لایه در کجا در نمایشگر نشان داده شود. شامل اطلاعاتی مثل موقعیت لبه‌های لایه و ترتیب Z آن نسبت‌به لایه‌های دیگر (اینکه باید جلوی لایه‌های دیگر باشد یا پشت آن‌ها).
محتوا مشخص می‌کند که محتوای لایه چگونه در محدوده تعیین‌شده توسط دارایی‌های موقعیتی ظاهر شود. این شامل برش (برای ازهم باز کردن محتوا به‌طوری که مرزهای لایه را پر کند) و تبدیل (برای نمایش محتوای چرخانده‌شده یا وارونه‌شده) می‌شود.
قطعه موسیقی نحوه ترکیب لایه با لایه‌های دیگر را تعریف می‌کند. شامل اطلاعاتی مثل حالت ترکیب و مقدار آلفای سراسری لایه برای ترکیب آلفا می‌شود.
بهینه‌سازی اطلاعاتی را ارائه می‌دهد که برای ترکیب‌بندی صحیح لایه کاملاً ضروری نیست، اما دستگاه «ترکیب‌بندی سخت‌افزاری» (HWC) می‌تواند از آن برای بهینه‌سازی عملکرد ترکیب‌بندی استفاده کند. این شامل منطقه نمایان لایه و بخشی است که از قاب قبلی به‌روز شده است.

نمایشگرها

نمایشگر واحد مهم دیگری از ترکیب است. یک سیستم می‌تواند چندین نمایشگر داشته باشد و نمایشگرها می‌توانند درطول عملیات عادی سیستم اضافه یا حذف شوند. نمایشگرها به درخواست HWC یا به درخواست چارچوب اضافه یا حذف می‌شوند.

وقتی نمایشگر خارجی به دستگاه متصل یا از آن جدا می‌شود، دستگاه HWC درخواست می‌کند نمایشگرها اضافه یا حذف شوند. این فرایند اتصال و جداسازی سریع نامیده می‌شود. کارخواهان نمایشگرهای مجازی را درخواست می‌کنند که محتوای آن‌ها به‌جای نمایشگر فیزیکی در بافر خارج از صفحه پردازش می‌شود.

نمایشگرهای مجازی

SurfaceFlinger از نمایشگر داخلی (تعبیه‌شده در تلفن یا رایانه لوحی)، نمایشگرهای خارجی (مانند تلویزیون متصل‌شده ازطریق HDMI)، و یک یا چند نمایشگر مجازی که خروجی ترکیبی را در سیستم دردسترس قرار می‌دهند پشتیبانی می‌کند. از نمایشگرهای مجازی می‌توان برای ضبط صفحه‌نمایش یا ارسال صفحه‌نمایش ازطریق شبکه استفاده کرد. قاب‌های تولیدشده برای نمایشگر مجازی در BufferQueue نوشته می‌شود.

نمایشگرهای مجازی ممکن است از همان مجموعه لایه‌های نمایشگر اصلی (پشته لایه) استفاده کنند یا مجموعه خودشان را داشته باشند. «همگام‌سازی عمودی» برای نمایشگر مجازی وجود ندارد، بنابراین «همگام‌سازی عمودی» برای نمایشگر داخلی ترکیب را برای همه نمایشگرها راه‌اندازی می‌کند.

در پیاده‌سازی‌های HWC که از نمایشگرهای مجازی پشتیبانی می‌کنند، نمایشگرهای مجازی را می‌توان با OpenGL ES (GLES)،‏ HWC، یا هر دو GLES و HWC ترکیب کرد. در پیاده‌سازی‌های غیرپشتیبانی‌شده، نمایشگرهای مجازی همیشه بااستفاده از GLES ترکیب می‌شوند.

مطالعه موردی: ضبط صفحه

فرمان screenrecord به کاربر اجازه می‌دهد هر چیزی را که روی صفحه نمایش داده می‌شود به‌عنوان فایل MP4 در دیسک ضبط کند. برای پیاده‌سازی این ویژگی، سیستم قاب‌های ترکیبی را از SurfaceFlinger دریافت می‌کند، آن‌ها را در کدبند ویدیو می‌نویسد، و سپس داده‌های ویدیو کدبندی‌شده را در فایلی می‌نویسد. کدک‌های ویدیو توسط فرایندی جداگانه (mediaserver) مدیریت می‌شوند، بنابراین بافرهای گرافیکی بزرگ باید در سیستم جابه‌جا شوند. برای چالش‌برانگیزتر کردن آن، هدف ضبط ویدیو ۶۰ فریم در ثانیه با وضوح کامل است. کلید کارآمد کردن این کار BufferQueue است.

کلاس MediaCodec به برنامه اجازه می‌دهد داده‌ها را به‌صورت بایت‌های خام در بافرها یا ازطریق سطح ارائه دهد. وقتی screenrecord درخواست دسترسی به کدبند ویدیو را می‌دهد، فرایند mediaserver یک BufferQueue ایجاد می‌کند، خود را به سمت مصرف‌کننده متصل می‌کند، سپس سمت تولیدکننده را به‌عنوان سطح به screenrecord برمی‌گرداند.

سپس ابزار screenrecord از SurfaceFlinger می‌خواهد که یک نمایشگر مجازی ایجاد کند که نمایشگر اصلی را قرینه می‌کند (یعنی همه لایه‌های یکسان را دارد) و آن را هدایت می‌کند تا برونداد را به سطحی که از فرایند mediaserver آمده است ارسال کند. در این مورد، SurfaceFlinger تولیدکننده میان‌گیرها است نه مصرف‌کننده.

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

مطالعه موردی: شبیه‌سازی نمایشگرهای ثانویه

‫WindowManager می‌تواند از SurfaceFlinger بخواهد لایه نمایانی ایجاد کند که SurfaceFlinger به‌عنوان مصرف‌کننده BufferQueue برای آن عمل می‌کند. همچنین می‌توانید از SurfaceFlinger بخواهید نمایشگر مجازی ایجاد کند که در آن SurfaceFlinger به‌عنوان تولیدکننده BufferQueue عمل می‌کند.

اگر نمایشگر مجازی را به لایه قابل‌مشاهده‌ای متصل کنید، حلقه بسته‌ای ایجاد می‌شود که در آن صفحه ترکیب‌شده در پنجره‌ای ظاهر می‌شود. اکنون آن پنجره بخشی از خروجی ترکیب‌شده است، بنابراین در بازآوری بعدی، تصویر ترکیب‌شده داخل پنجره محتوای پنجره را نیز نشان می‌دهد. برای دیدن این ویژگی در عمل، گزینه‌های توسعه‌دهنده را در تنظیمات فعال کنید، شبیه‌سازی نمایشگرهای ثانویه را انتخاب کنید، و پنجره‌ای را فعال کنید. برای دیدن عملکرد نمایشگرهای دوم، از screenrecord برای ضبط کردن عمل فعال کردن نمایشگر استفاده کنید و سپس آن را قاب‌به‌قاب پخش کنید.