الطبقات وعمليات العرض

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

الطبقات

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

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

الشاشات

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

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

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

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

في عمليات تنفيذ HWC التي تتيح ذلك، يمكن إنشاء شاشات العرض الافتراضية باستخدام OpenGL ES (GLES) أو HWC أو كل من 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 لتسجيل عملية تفعيل الشاشة ثم إعادة تشغيلها إطارًا تلو الآخر.