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