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.