SurfaceFlinger وWindowManager

يقبل 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 استخدام هذه البيانات لتركيب المساحات على الشاشة.

التدوير المسبق

لا تتيح العديد من تراكبات الأجهزة إمكانية التدوير (وحتى إذا كانت تتيحها، فإنّ ذلك يتطلّب طاقة معالجة)، والحلّ هو تحويل المخزن المؤقت قبل وصوله إلى SurfaceFlinger. يتيح نظام التشغيل Android تلميحًا للاستعلام (NATIVE_WINDOW_TRANSFORM_HINT) في ANativeWindow لتمثيل عملية التحويل الأكثر احتمالاً التي سيطبّقها SurfaceFlinger على المخزن المؤقت. يمكن أن تستخدم برامج تشغيل GL هذه التلميحة لتعديل المخزن المؤقت مسبقًا قبل وصوله إلى SurfaceFlinger، وذلك لضمان تعديله بشكل صحيح عند وصوله.

على سبيل المثال، عند تلقّي تلميح بتدوير الشاشة بمقدار 90 درجة، يمكنك إنشاء مصفوفة وتطبيقها على المخزن المؤقت لمنع خروجها من نهاية الصفحة. للحفاظ على الطاقة، عليك إجراء ذلك قبل التدوير. للحصول على التفاصيل، يُرجى الاطّلاع على واجهة ANativeWindow المحدّدة في system/core/include/system/window.h.