يقبل 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 ويمكّن التطبيق من إنشاء SurfaceControls التي تتوافق مع الطبقات على الشاشة. يمكن إنشاؤه كطفل تابع لـ ANativeWindow أو باعتباره تابعًا لـ ASurfaceControl آخر. |
ASurfaceTransaction | Wraps Transaction لتمكين العميل من تحرير الخصائص الوصفية للطبقة ، مثل الهندسة ، وإرسال المخازن المؤقتة المحدثة إلى 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
.