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