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. تحصل التطبيقات بعد ذلك على معلومات عن مثيلات ASurfaceTransaction من خلال عمليات الاستدعاء التي تُرسل ASurfaceTransactionStats التي تحتوي على معلومات، مثل وقت الربط وأوقات الاكتساب وما إلى ذلك.

يتضمن الجدول التالي مزيدًا من التفاصيل حول ASurfaceControl و مكوناته المرتبطة:

المكوّن الوصف
ASurfaceControl يُغلِّف SurfaceControl ويسمح للتطبيق بإنشاء مثيلات SurfaceControl تتوافق مع الطبقات على الشاشة.

يمكن إنشاؤه كعنصر تابع ANativeWindow أو كعنصر تابع لمثيل ASurfaceControl آخر.
ASurfaceTransaction لفّ Transaction لإتاحة تعديل العميل للخصائص الوصفية للطبقة، مثل الأشكال الهندسية، وإرسال المخازن المؤقتة المعدَّلة إلى SurfaceFlinger
ASurfaceTransactionStats تُرسِل هذه العملية معلومات عن المعاملات التي تم عرضها، مثل وقت الانتظار ووقت اكتساب الإصدار السابق ووقت الانتظار السابق للإصدار، إلى تطبيق من خلال callback مسجَّل مسبقًا.

على الرغم من أنّ التطبيقات يمكنها إرسال ذاكرات التخزين المؤقت في أي وقت، لا يتم تفعيل SurfaceFlinger إلا لقبول ذاكرات التخزين المؤقت بين عمليات إعادة تحميل الشاشة، والتي يمكن أن تختلف حسب الجهاز. ويؤدي ذلك إلى تقليل استخدام الذاكرة وتجنُّب حدوث تمزّق مرئي على الشاشة، والذي يمكن أن يحدث عند تعديل الشاشة أثناء عملية إعادة التحميل.

عندما تكون الشاشة بين عمليات إعادة التحميل، تُرسِل الشاشة إشارة VSync إلى SurfaceFlinger. تشير إشارة VSync إلى أنّه يمكن إعادة رسوم الشاشة بدون تمزيق. عندما يتلقّى SurfaceFlinger إشارة VSync، يبحث SurfaceFlinger في قائمة الطبقات بحثًا عن وحدات تخزين مؤقتة جديدة. إذا عثر 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 درجة، يمكنك إنشاء matroid وتطبيقه على المخزن المؤقت لمنع تجاوزه نهاية الصفحة. لتوفير الطاقة، عليك إجراء هذا الدوران المُسبَق. لمعرفة التفاصيل، يُرجى الاطّلاع على ANativeWindow واجهة system/core/include/system/window.h.