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

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

الطبقات

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

الخاصية الوصف
الكلمات الرئيسية المتعلّقة بالموضع لتحديد مكان ظهور الطبقة على الشاشة يتضمّن معلومات مثل مواضع حواف الطبقة وترتيبها حسب المحور Z بالنسبة إلى الطبقات الأخرى (سواء كان يجب أن تكون أمام الطبقات الأخرى أو خلفها).
المحتوى تحدد كيفية تقديم المحتوى المعروض على الطبقة داخل بالحدود التي تحددها خصائص الموضع. تشمل هذه المعلومات الاقتصاص (لتوسيع جزء من المحتوى لملء حدود الطبقة) والتحويل (لعرض محتوى مُدار أو مقلوب).
مقطوعة موسيقية يحدِّد كيفية دمج الطبقة مع الطبقات الأخرى. الخدمات المضمّنة مثل وضع المزج وقيمة ألفا على مستوى الطبقة لـ ألفا التجميع.
تحسين يوفّر معلومات ليست ضرورية تمامًا لدمج الطبقة بشكل صحيح، ولكن يمكن لجهاز "أداة تركيب الأجهزة" (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 كمستهلك في قائمة الانتظار المؤقت. من الممكن أيضًا أن تطلب من SurfaceFlinger إنشاء شاشة افتراضية، ويعمل SurfaceFlinger فيها بمثابة مُنشئ BufferQueue.

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