SurfaceFlinger و WindowManager

يقبل 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 والمكونات المرتبطة به.

عنصر وصف
التحكم في السطح يلتف SurfaceControl ويمكّن التطبيق من إنشاء SurfaceControls التي تتوافق مع الطبقات الموجودة على الشاشة.

يمكن إنشاؤه باعتباره تابعًا لـ ANativeWindow أو كتابع لـ ASurfaceControl آخر.
ASurfaceTransaction يلتف المعاملة لتمكين العميل من تحرير الخصائص الوصفية للطبقة، مثل الشكل الهندسي، ويرسل المخازن المؤقتة المحدثة إلى SurfaceFlinger.
ASurfaceTransactionStats يرسل معلومات حول المعاملات التي تم تقديمها، مثل وقت الإغلاق، وأوقات الاكتساب، وسياج الإصدار السابق، إلى التطبيق من خلال رد اتصال مسجل مسبقًا.

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

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

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

مدير النافذة

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

ما قبل الدوران

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

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