يقبل 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
.