لایه ها و نمایشگرها دو اصل اولیه هستند که کار ترکیب و تعامل با سخت افزار نمایشگر را نشان می دهند.
لایه ها
یک لایه مهم ترین واحد ترکیب است. یک لایه ترکیبی از یک سطح و یک نمونه از SurfaceControl
است. هر لایه دارای مجموعه ای از خصوصیات است که نحوه تعامل آن با لایه های دیگر را مشخص می کند. ویژگی های لایه در جدول زیر توضیح داده شده است.
اموال | توضیحات |
---|---|
موقعیتی | تعیین می کند که لایه در کجا ظاهر می شود. شامل اطلاعاتی مانند موقعیت لبههای یک لایه و ترتیب Z آن نسبت به لایههای دیگر (خواه در جلو یا پشت لایههای دیگر باشد). |
محتوا | تعریف می کند که چگونه محتوای نمایش داده شده در لایه باید در محدوده های تعریف شده توسط ویژگی های موقعیتی ارائه شود. شامل اطلاعاتی مانند برش (برای گسترش بخشی از محتوا برای پر کردن مرزهای لایه) و تبدیل (برای نشان دادن محتوای چرخش شده یا برگردانده شده). |
ترکیب | تعریف می کند که چگونه لایه باید با لایه های دیگر ترکیب شود. شامل اطلاعاتی مانند حالت ترکیبی و مقدار آلفای یک لایه برای ترکیب آلفا است. |
بهینه سازی | اطلاعاتی را ارائه می دهد که برای ترکیب صحیح لایه ضروری نیست، اما می تواند توسط دستگاه Hardware Composer (HWC) برای بهینه سازی نحوه اجرای ترکیب استفاده شود. شامل اطلاعاتی مانند ناحیه قابل مشاهده لایه و اینکه کدام بخش از لایه از قاب قبلی به روز شده است. |
نمایش می دهد
نمایشگر یکی دیگر از واحدهای مهم ترکیب بندی است. یک سیستم می تواند چندین نمایشگر داشته باشد و نمایشگرها را می توان در طول عملیات عادی سیستم اضافه یا حذف کرد. نمایشگرها به درخواست HWC یا بنا به درخواست چارچوب اضافه/حذف می شوند. هنگامی که یک صفحه نمایش خارجی به دستگاه متصل یا قطع می شود، نمایشگرهای درخواستی دستگاه HWC اضافه یا حذف شوند که به آن هات پلاگ می گویند. مشتریان نمایشهای مجازی را درخواست میکنند که محتوای آنها به جای نمایش فیزیکی در یک بافر خارج از صفحه نمایش داده میشود.
نمایشگرهای مجازی
SurfaceFlinger از یک نمایشگر داخلی (ساخته شده در تلفن یا تبلت)، نمایشگرهای خارجی (مانند تلویزیون متصل از طریق HDMI) و یک یا چند نمایشگر مجازی که خروجی ترکیبی را در سیستم در دسترس قرار می دهد، پشتیبانی می کند. از نمایشگرهای مجازی می توان برای ضبط صفحه یا ارسال صفحه از طریق شبکه استفاده کرد. فریم های تولید شده برای نمایش مجازی در BufferQueue نوشته می شوند.
نمایشگرهای مجازی ممکن است مجموعه ای از لایه ها را با نمایشگر اصلی (پشته لایه) به اشتراک بگذارند یا مجموعه خود را داشته باشند. VSYNC برای نمایشگر مجازی وجود ندارد، بنابراین VSYNC برای نمایشگر داخلی ترکیب را برای همه نمایشگرها فعال می کند.
در پیاده سازی های HWC که از آنها پشتیبانی می کنند، نمایشگرهای مجازی را می توان با OpenGL ES (GLES)، HWC یا هر دو GLES و HWC ترکیب کرد. در پیاده سازی های غیر پشتیبانی، نمایشگرهای مجازی همیشه با استفاده از GLES ترکیب می شوند.
مطالعه موردی: ضبط صفحه
دستور screenrecord
به کاربر این امکان را می دهد که هر چیزی را که روی صفحه ظاهر می شود به صورت فایل .mp4
روی دیسک ضبط کند. برای پیاده سازی این، سیستم فریم های ترکیبی را از SurfaceFlinger دریافت می کند، آنها را در رمزگذار ویدیو می نویسد و سپس داده های ویدیوی کدگذاری شده را در یک فایل می نویسد. کدک های ویدیویی توسط یک فرآیند جداگانه ( mediaserver
) مدیریت می شوند، بنابراین بافرهای گرافیکی بزرگ باید در سراسر سیستم حرکت کنند. برای چالش برانگیزتر کردن آن، هدف ضبط ویدئویی با سرعت 60 فریم در ثانیه با وضوح کامل است. کلید کارآمد کردن این کار BufferQueue است.
کلاس MediaCodec
به برنامه اجازه می دهد تا داده ها را به صورت بایت خام در بافرها یا از طریق یک سطح ارائه دهد. هنگامی که screenrecord
درخواست دسترسی به یک رمزگذار ویدیویی را میدهد، فرآیند mediaserver
یک BufferQueue ایجاد میکند، خود را به سمت مصرفکننده متصل میکند، سپس سمت تولیدکننده را برای screenrecord
به عنوان یک سطح ارسال میکند.
ابزار screenrecord
سپس از SurfaceFlinger میخواهد تا یک نمایشگر مجازی ایجاد کند که نمایشگر اصلی را منعکس کند (یعنی همه لایههای یکسانی دارد)، و آن را هدایت میکند تا خروجی را به سطحی که از فرآیند mediaserver
آمده است ارسال کند. در این مورد، SurfaceFlinger به جای مصرف کننده، تولید کننده بافرها است.
پس از تکمیل پیکربندی، هنگامی که داده های رمزگذاری شده ظاهر می شوند screenrecord
فعال می شود. همانطور که برنامهها طراحی میشوند، بافرهای آنها به SurfaceFlinger میرود، که آنها را در یک بافر واحد ترکیب میکند که مستقیماً در فرآیند mediaserver
به رمزگذار ویدیو ارسال میشود. فریم های کامل هرگز با فرآیند screenrecord
دیده نمی شوند. در داخل، فرآیند mediaserver
روش خاص خود را برای جابجایی بافرها در اطراف دارد که همچنین داده ها را توسط دسته منتقل می کند و هزینه های اضافی را به حداقل می رساند.
مطالعه موردی: شبیه سازی نمایشگرهای ثانویه
WindowManager می تواند از SurfaceFlinger بخواهد تا یک لایه قابل مشاهده ایجاد کند که SurfaceFlinger برای آن به عنوان مصرف کننده BufferQueue عمل می کند. همچنین ممکن است از SurfaceFlinger بخواهید یک صفحه نمایش مجازی ایجاد کند که SurfaceFlinger به عنوان تولید کننده BufferQueue برای آن عمل می کند.
اگر یک صفحه نمایش مجازی را به یک لایه قابل مشاهده متصل کنید، یک حلقه بسته ایجاد می شود که در آن صفحه ترکیبی در یک پنجره ظاهر می شود. آن پنجره اکنون بخشی از خروجی ترکیبی است، بنابراین در رفرش بعدی تصویر ترکیبی داخل پنجره محتویات پنجره را نیز نشان می دهد. برای مشاهده عملکرد، گزینه های برنامه نویس را در تنظیمات فعال کنید، شبیه سازی نمایشگرهای ثانویه را انتخاب کنید و یک پنجره را فعال کنید. برای مشاهده عملکرد نمایشگرهای ثانویه، screenrecord
استفاده کنید تا عمل فعال کردن نمایشگر را ضبط کنید و سپس آن را فریم به فریم پخش کنید.