SurfaceFlinger وWindowsManager

يقبل SurfaceFlinger الموارد الاحتياطية وينشئ مخازن مؤقتة ويرسلها إلى العرض. يقدّم WindowManager لـ SurfaceFlinger وحدات تخزين مؤقت وملف ملف ملف البيانات الوصفية للنوافذ، والتي يستخدمها SurfaceFlinger لدمج مساحات العرض على الشاشة.

سطح قاطع

يمكن لـ SurfaceFlinger قبول الموارد الاحتياطية بطريقتين: من خلال BufferInventory SurfaceControl أو من خلال ASurfaceControl.

تتمثل إحدى طرق قبول SurfaceFlinger للوسائط المخزّنة في BufferQueue و SurfaceControl. عندما يأتي أحد التطبيقات إلى المقدمة، يطلب مخازن مؤقتة من WindowManager. بعد ذلك، يطلب WindowManager طبقة من SurfaceFlinger. الطبقة هي عبارة عن تركيبة من سطح يحتوي على BufferQueue وSurfaceControl يحتوي على البيانات الوصفية للطبقة، مثل إطار العرض. ينشئ SurfaceFlinger الطبقة ويرسلها إلى WindowManager. بعد ذلك، يُرسِل WindowManager سطح العرض إلى التطبيق، ولكنه يحتفظ بـ SurfaceControl لتعديل مظهر التطبيق على الشاشة.

سيضيف Android 10 عنصر ASurfaceControl، وهو عنصر قبول SurfaceFlinger للمورد الاحتياطي. يجمع ASurfaceControl بين سطح وSurfaceControl في حزمة معاملة واحدة يتم إرسالها إلى SurfaceFlinger. يرتبط ASurfaceControl بطبقة، أي التطبيقات تحديث من خلال ASurfaceTransaction. تحصل التطبيقات بعد ذلك على معلومات حول ASurfaceالمعاملات من خلال عمليات الاستدعاء التي تجتاز ASurfacetransactionStats يحتوي على معلومات، مثل وقت المزلاج، وأوقات الاكتساب، وما إلى ذلك.

يتضمّن الجدول التالي مزيدًا من التفاصيل حول ASurfaceControl ومقتَطعاته المرتبطة.

المكوّن الوصف
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 في عناصر window، وهي حاويات لعناصر view. تستند عناصر النوافذ دائمًا إلى عناصر السطح. يشرف WindowManager على دورات الحياة والإدخال والتركيز أحداث، اتجاه الشاشة، انتقالات، رسوم متحركة، موضع، تحويلات، ترتيب z، والعديد من جوانب النافذة الأخرى. يرسل WindowManager جميع البيانات الوصفية للنافذة إلى SurfaceFlinger ليتمكّن SurfaceFlinger من استخدام تلك البيانات الأسطح المركبة على الشاشة.

التغيير المسبق

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

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