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

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

الطبقات

الطبقة هي أهم وحدة في التركيب. الطبقة هي مزيج من سطح ومثيل SurfaceControl. تحتوي كل طبقة على مجموعة من السمات التي تحدد كيفية تفاعلها مع الطبقات الأخرى. يتم وصف سمات الطبقة في الجدول أدناه.

الخاصية الوصف
المحتوى المتعلّق بالموضع يحدِّد مكان ظهور الطبقة على الشاشة. يتضمّن معلومات مثل مواضع حواف الطبقة وترتيبها حسب المحور Z بالنسبة إلى الطبقات الأخرى (سواء كان يجب أن تكون أمام الطبقات الأخرى أو خلفها).
المحتوى تحدّد كيفية عرض المحتوى المعروض على الطبقة ضمن الحدود التي تحدّدها السمات الموضعية. تشمل هذه المعلومات الاقتصاص (لتوسيع جزء من المحتوى لملء حدود الطبقة) والتحويل (لعرض محتوى مُدار أو مقلوب).
مقطوعة موسيقية يحدِّد كيفية دمج الطبقة مع الطبقات الأخرى. يتضمّن معلومات مثل وضع المزج وقيمة شفافية على مستوى الطبقة لدمج الشفافية.
تحسين يوفّر معلومات ليست ضرورية تمامًا لدمج الطبقة بشكل صحيح، ولكن يمكن لجهاز "أداة تركيب الأجهزة" (HWC) استخدامها لتحسين كيفية تنفيذ عملية الدمج. يتضمّن معلومات، مثل المنطقة المرئية من الطبقة والجزء من الطبقة الذي تم تعديله منذ اللقطة السابقة.

الشاشات

الشاشة هي وحدة أخرى مهمة للتركيب. يمكن أن يحتوي النظام على عدة شاشات ويمكن إضافة شاشات أو إزالتها أثناء عمليات النظام العادية. تتم إضافة/إزالة الشاشات بناءً على طلب من "وحدة التحكّم في الأجهزة" أو بناءً على طلب من إطار العمل. يطلب جهاز HWC إضافة شاشات أو إزالتها عند توصيل شاشة خارجية أو فصلها عن الجهاز، ما يُعرف باسم hotplugging. يطلب العملاء شاشات افتراضية يتم عرض محتواها في ذاكرة تخزين مؤقت خارج الشاشة بدلاً من عرضها على شاشة فعلية.

الشاشات الافتراضية

يتيح SurfaceFlinger استخدام شاشة داخلية (مدمجة في الهاتف أو الجهاز اللوحي) وشاشات خارجية (مثل تلفزيون متصل من خلال منفذ HDMI) وشاشة افتراضية واحدة أو أكثر تتيح إمكانية عرض مُركّب داخل النظام. يمكن استخدام الشاشات الافتراضية لتسجيل الشاشة أو إرسال الشاشة عبر شبكة. يتم كتابة الإطارات التي يتم إنشاؤها لشاشة افتراضية في BufferQueue.

قد تشترك الشاشات الافتراضية في المجموعة نفسها من الطبقات التي تستخدمها الشاشة الرئيسية (حزمة الطبقات) أو قد تستخدم مجموعة خاصة بها. لا يتوفّر معيار VSYNC للشاشة الافتراضية، لذلك يؤدي معيار VSYNC للشاشة الداخلية إلى بدء عملية الدمج لجميع الشاشات.

في عمليات تنفيذ HWC التي تتيح ذلك، يمكن دمج الشاشة الافتراضية باستخدام OpenGL ES (GLES) أو HWC أو كليهما. في عمليات التنفيذ غير المتوافقة، يتم دائمًا دمج الشاشات الافتراضية باستخدام GLES.

دراسة حالة: screenrecord

يسمح الأمر screenrecord للمستخدم بتسجيل كل ما يظهر على الشاشة كملف .mp4 على القرص. لتنفيذ ذلك، يتلقّى النظام لقطات مجمّعة من SurfaceFlinger ويكتبها في برنامج ترميز الفيديو، ثم يكتب بيانات الفيديو المشفّرة في ملف. تتم إدارة برامج ترميز الفيديو من خلال عملية منفصلة (mediaserver)، لذا يجب نقل وحدات تخزين الرسومات الكبيرة في النظام. لزيادة مستوى الصعوبة، ننصحك بتسجيل فيديو بمعدّل 60 لقطة في الثانية وبدرجة دقة كاملة. إنّ مفتاح تحقيق ذلك بكفاءة هو BufferQueue.

تسمح فئة MediaCodec للتطبيق بتقديم البيانات كوحدات بايت أولية في وحدات التخزين المؤقت، أو من خلال سطح. عندما يطلب screenrecord الوصول إلى ملف ترميز فيديو، تنشئ عملية mediaserver صفًا للانتظار، وتربطه بجانب المستخدِم، ثم تعيد توجيه جانب المُنشئ إلى screenrecord كسطح.

بعد ذلك، تطلب الأداة screenrecord من SurfaceFlinger إنشاء سطح شاشة افتراضي يحاكي الشاشة الرئيسية (أي أنّه يتضمّن كل المستويات نفسها)، وتوجّهه لإرسال الإخراج إلى السطح الذي تم إنشاؤه من عملية mediaserver. في هذه الحالة، يكون SurfaceFlinger هو مُنشئ المخازن المؤقتة بدلاً من المستخدِم.

بعد اكتمال الإعداد، يتم تنشيط screenrecord عند ظهور البيانات المشفَّرة. أثناء رسم التطبيقات، يتم نقل ذاكرات التخزين المؤقت إلى SurfaceFlinger، التي تجمعها في ذاكرة تخزين مؤقت واحدة يتم إرسالها مباشرةً إلى mediaserver لتشفير الفيديو. لا تتم معالجة اللقطات الكاملة أبدًا في عملية screenrecord. داخليًا، تمتلك عملية mediaserver طريقة خاصة بها لنقل المخزن المؤقت الذي ينقل البيانات أيضًا من خلال المعرّف، ما يقلل من الوقت المستغرَق.

دراسة حالة: محاكاة الشاشات الثانوية

يمكن أن يطلب WindowManager من SurfaceFlinger إنشاء طبقة مرئية يعمل فيها SurfaceFlinger كمستهلك BufferQueue. من الممكن أيضًا أن تطلب من SurfaceFlinger إنشاء شاشة افتراضية، ويعمل SurfaceFlinger فيها بمثابة مُنشئ BufferQueue.

في حال ربط شاشة افتراضية بطبقة مرئية، يتم إنشاء حلقة مغلقة تظهر فيها الشاشة المجمّعة في نافذة. أصبحت هذه النافذة الآن جزءًا من المخرجات المركّبة، لذا عند التحديث التالي، تعرِض الصورة المركّبة داخل النافذة محتوى النافذة أيضًا. للاطّلاع على هذه الميزة، فعِّل خيارات المطوّرين في الإعدادات، ثم اختَر محاكاة الشاشات الثانوية، وفعِّل نافذة. للاطّلاع على العروض الثانوية أثناء التشغيل، استخدِم screenrecord لتسجيل عملية تفعيل الشاشة ثم إعادة تشغيلها إطارًا تلو الآخر.