الطبقات والشاشات

الطبقات والشاشات هما عنصران أساسيان يمثّلان عملية التركيب والتفاعلات مع أجهزة العرض.

الطبقات

الطبقة هي أهم وحدة في التركيب. الطبقة هي مزيج من مساحة عرض ومثيل من 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 لتسجيل عملية تفعيل الشاشة ثم إعادة تشغيلها إطارًا بإطار.