يقبل SurfaceFlinger المخازن المؤقتة ويجمعها ويرسلها إلى الشاشة. توفّر WindowManager لـ SurfaceFlinger المخازن المؤقتة والبيانات الوصفية للنافذة، والتي يستخدمها SurfaceFlinger بعد ذلك لدمج مساحات العرض على الشاشة.
SurfaceFlinger
يمكن أن يقبل SurfaceFlinger المخازن المؤقتة بطريقتَين: من خلال BufferQueue وSurfaceControl، أو من خلال ASurfaceControl.
تتمثّل إحدى الطرق التي تقبل بها خدمة SurfaceFlinger المخازن المؤقتة في استخدام BufferQueue وSurfaceControl. عندما يظهر تطبيق في المقدّمة، يطلب مخازن مؤقتة من
WindowManager. يطلب WindowManager بعد ذلك طبقة من SurfaceFlinger. الطبقة هي مزيج من مساحة عرض تحتوي على BufferQueue، ومثيل SurfaceControl، يحتوي على البيانات الوصفية للطبقة، مثل إطار العرض.
ينشئ SurfaceFlinger الطبقة ويرسلها إلى WindowManager. WindowManager
ثم يرسل السطح إلى التطبيق، لكنّه يحتفظ بنسخة SurfaceControl
للتلاعب بمظهر التطبيق على الشاشة.
بدءًا من Android 10، يوفّر ASurfaceControl طريقة أخرى تتيح لـ SurfaceFlinger قبول المخازن المؤقتة. تجمع ASurfaceControl بين مساحة عرض ومثيل SurfaceControl في حزمة معاملات واحدة يتلقّاها SurfaceFlinger. يرتبط ASurfaceControl بطبقة، وتعدِّل التطبيقات هذه الطبقة من خلال مثيلات ASurfaceTransaction. بعد ذلك، تحصل التطبيقات على معلومات حول مثيلات ASurfaceTransaction من خلال عمليات رد الاتصال التي تنقل ASurfaceTransactionStats التي تحتوي على معلومات، مثل وقت الإغلاق وأوقات الاكتساب، على سبيل المثال.
يوضّح الجدول التالي ASurfaceControl والمكوّنات المرتبطة به:
| المكوّن | الوصف |
|---|---|
ASurfaceControl |
تغلف SurfaceControl وتسمح لأحد التطبيقات بإنشاء مثيلات SurfaceControl تتوافق مع الطبقات المعروضة.يمكن إنشاء هذه الطبقات كعنصر تابع لـ ANativeWindow أو كعنصر تابع لمثيل ASurfaceControl آخر. |
ASurfaceTransaction |
تتضمّن Transaction للسماح للعميل بتعديل الخصائص الوصفية لإحدى الطبقات، مثل الشكل الهندسي، وترسل المخازن المؤقتة المعدَّلة إلى SurfaceFlinger. |
ASurfaceTransactionStats |
ترسل هذه السمة معلومات حول المعاملات التي تم عرضها، مثل وقت الإغلاق وأوقات الحصول على الترخيص وحدود الإصدار السابق، إلى أحد التطبيقات من خلال دالة ردّ مسجّلة مسبقًا. |
على الرغم من أنّ التطبيقات يمكنها إرسال المخازن المؤقتة في أي وقت، لا يتم تنشيط SurfaceFlinger إلا لقبول المخازن المؤقتة بين عمليات إعادة تحميل الشاشة، والتي يمكن أن تختلف حسب الجهاز. يقلّل ذلك من استخدام الذاكرة ويتجنّب حدوث تشوّش مرئي على الشاشة، وهو ما قد يحدث عند تعديل العرض في منتصف عملية إعادة التحميل.
عندما تكون الشاشة بين عمليات إعادة التحميل، ترسل الشاشة إشارة VSync إلى SurfaceFlinger. تشير إشارة VSync إلى أنّه يمكن تحديث الشاشة بدون حدوث تشوّش. عندما يتلقّى SurfaceFlinger إشارة VSync، يتصفّح قائمة الطبقات بحثًا عن مخازن مؤقتة جديدة. إذا عثر على مخزن مؤقت جديد، سيحصل SurfaceFlinger على المخزن المؤقت، وإذا لم يعثر عليه، سيواصل استخدام المخزن المؤقت الذي تم الحصول عليه سابقًا. يجب أن يعرض SurfaceFlinger دائمًا شيئًا ما، لذا فهو يعتمد على مخزن مؤقت واحد. إذا لم يتم إرسال أي مخازن مؤقتة على أي طبقة، سيتجاهل SurfaceFlinger الطبقة.
بعد أن يجمع SurfaceFlinger جميع المخازن المؤقتة للطبقات المرئية، يطلب من Hardware Composer (HWC) تحديد كيفية إجراء عملية الدمج. إذا صنّف HWC نوع تركيبة الطبقة على أنّه تركيبة من جانب العميل، يركّب SurfaceFlinger هذه الطبقات. بعد ذلك، يمرِّر SurfaceFlinger المخزن المؤقت للإخراج إلى HWC.
WindowManager
تتحكّم WindowManager في عناصر Window،
وهي حاويات لعناصر View. تستند عناصر Window دائمًا إلى عناصر
Surface.
WindowManager تشرف على دورات الحياة وأحداث الإدخال والتركيز
واتجاه الشاشة وعمليات الانتقال والحركات والموضع وعمليات التحويل
وترتيب العناصر حسب محور z والعديد من الجوانب الأخرى المتعلقة بالنافذة. يرسل WindowManager جميع البيانات الوصفية الخاصة بالنافذة إلى SurfaceFlinger كي يتمكّن الأخير من استخدام هذه البيانات لدمج مساحات العرض على الشاشة.
التدوير المسبق
لا تتيح العديد من التراكبات المستندة إلى الأجهزة إمكانية التدوير (وحتى إذا كانت تتيحها، فإنّ ذلك يتطلّب قدرة معالجة كبيرة)، والحلّ هو تحويل المخزن المؤقت قبل وصوله إلى SurfaceFlinger. يتيح نظام التشغيل Android تلميحًا للاستعلام (NATIVE_WINDOW_TRANSFORM_HINT) في ANativeWindow لتمثيل عملية التحويل الأكثر احتمالاً التي ستطبّقها خدمة SurfaceFlinger على المخزن المؤقت.
يمكن أن تستخدم برامج تشغيل GL هذه التلميحة لتعديل المخزن المؤقت مسبقًا قبل وصوله إلى SurfaceFlinger، وذلك لضمان تعديله بشكل صحيح عند وصوله.
على سبيل المثال، عند تلقّي تلميح بتدوير الصورة بمقدار 90 درجة، يمكنك إنشاء مصفوفة وتطبيقها على المخزن المؤقت لمنع الصورة من الخروج من نهاية الصفحة. للحفاظ على الطاقة، عليك إجراء ذلك قبل التدوير. للحصول على التفاصيل، يُرجى الاطّلاع على واجهة ANativeWindow المحدّدة في system/core/include/system/window.h.