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

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

الطبقات

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