الطبقات والشاشات هما عنصران أساسيان يمثّلان عملية التركيب والتفاعلات مع أجهزة العرض.
الطبقات
الطبقة هي أهم وحدة في التركيب. الطبقة هي
مزيج من سطح ومثيل من
SurfaceControl
.
تحتوي كل طبقة على مجموعة من الخصائص التي تحدّد كيفية تفاعلها مع الطبقات الأخرى. يتم وصف خصائص الطبقة في الجدول التالي:
الخاصية | الوصف |
---|---|
موضعي | تحدّد هذه السمة مكان ظهور الطبقة على شاشتها. يتضمّن معلومات، مثل مواضع حواف الطبقة وترتيبها حسب المحور Z بالنسبة إلى الطبقات الأخرى (ما إذا كان يجب أن تكون الطبقة في المقدّمة أو الخلفية مقارنةً بالطبقات الأخرى). |
المحتوى | تحدّد هذه السمة طريقة عرض المحتوى على الطبقة ضمن الحدود التي تحدّدها السمات الموضعية. تتضمّن هذه السمة معلومات، مثل الاقتصاص (لتوسيع جزء من المحتوى لملء حدود الطبقة) والتحويل (لعرض محتوى تم تدويره أو قلبه). |
مقطوعة موسيقية | تحدّد هذه السمة كيفية دمج الطبقة مع الطبقات الأخرى. تتضمّن هذه السمة معلومات مثل وضع المزج وقيمة ألفا على مستوى الطبقة لتركيب ألفا. |
تحسين | توفّر هذه السمة معلومات غير ضرورية تمامًا لتركيب الطبقة بشكل صحيح، ولكن يمكن أن يستخدمها جهاز Hardware Composer (HWC) لتحسين طريقة تنفيذ عملية التركيب. تتضمّن هذه السمة معلومات، مثل المنطقة المرئية من الطبقة والجزء الذي تم تعديله من الطبقة منذ الإطار السابق. |
الشاشات
العرض هو وحدة مهمة أخرى من وحدات التركيب. يمكن أن يتضمّن النظام شاشات عرض متعدّدة، ويمكن إضافة شاشات عرض أو إزالتها أثناء عمليات النظام العادية. تتم إضافة العروض أو إزالتها بناءً على طلب من HWC أو من إطار العمل. يطلب جهاز HWC إضافة شاشات أو إزالتها عند توصيل شاشة خارجية بالجهاز أو فصلها عنه، ويُطلق على هذه العملية اسم التوصيل السريع. تطلب البرامج شاشات عرض افتراضية يتم عرض محتواها في مخزن مؤقت خارج الشاشة بدلاً من شاشة عرض فعلية.
الشاشات الافتراضية
يتوافق SurfaceFlinger مع شاشة عرض داخلية (مدمجة في الهاتف أو الجهاز اللوحي) وشاشات عرض خارجية (مثل تلفزيون متصل من خلال HDMI) وشاشة عرض افتراضية واحدة أو أكثر تتيح إخراجًا مجمّعًا داخل النظام. يمكن استخدام الشاشات الافتراضية لتسجيل الشاشة أو إرسالها عبر شبكة. تتم كتابة الإطارات التي تم إنشاؤها لشاشة عرض افتراضية في BufferQueue.
قد تتشارك الشاشات الافتراضية في مجموعة الطبقات نفسها التي تتشارك فيها الشاشة الرئيسية (مجموعة الطبقات) أو قد يكون لديها مجموعتها الخاصة. لا يتوفّر VSync لشاشة افتراضية، لذا يؤدي VSync للشاشة الداخلية إلى تشغيل عملية التركيب لجميع الشاشات.
في عمليات تنفيذ HWC التي تتيح استخدامها، يمكن إنشاء صور مركّبة لشاشات افتراضية باستخدام OpenGL ES (GLES) أو HWC أو كليهما. في عمليات التنفيذ غير المتوافقة، يتم دائمًا تركيب الشاشات الافتراضية باستخدام GLES.
دراسة حالة: screenrecord
يتيح الأمر 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
لتسجيل عملية تفعيل الشاشة ثم إعادة تشغيلها إطارًا بإطار.