SurfaceFlinger وWindowsManager

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

يتضمّن الجدول التالي مزيدًا من التفاصيل حول ASurfaceControl ومقتَطعاته المرتبطة.

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

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

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

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

بعد أن يجمع SurfaceFlinger كل المخازن المؤقتة للطبقات المرئية، يسأل منشئ الأجهزة (HWC) عن طريقة تنفيذ التركيب. إذا وضع HWC علامة على نوع تركيب الطبقة كتركيب عميل، فسيركب SurfaceFlinger هذه الطبقات. بعد ذلك، يُرسِل SurfaceFlinger وحدة تخزين مؤقت للإخراج إلى HWC.

WindowManager

يتحكّم WindowManager في عناصر window، وهي حاويات لعناصر view. دائمًا ما يتم دعم كائنات النوافذ بكائنات السطح. يتولى WindowManager الإشراف على دورات الحياة وأحداث الإدخال والتركيز واتجاه الشاشة والانتقالات والصور المتحركة والموضع والتحولات وترتيب z والعديد من الجوانب الأخرى للنافذة. يُرسِل WindowManager جميع البيانات الوصفية للنوافذ إلى SurfaceFlinger حتى يتمكّن SurfaceFlinger من استخدام هذه البيانات ل تجميع مساحات العرض على الشاشة.

التغيير المسبق

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

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