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