طبقات HAL المركبة في Composer (HWC) التي تم تلقّيها من SurfaceFlinger، يتم تقليل مقدار تركيبة OpenGL ES (GLES) وأداء وحدة معالجة الرسومات.
تُلخِّص واجهة برمجة التطبيقات HWC العناصر، مثل العناصر التي تظهر على سطح الشاشة وأدوات معالجة الصور ثنائية الأبعاد، لتركيب السطوح والتواصل مع الأجهزة المخصّصة لتركيب النوافذ بهدف تركيب النوافذ. استخدِم HWC لدمج النوافذ بدلاً من استخدام SurfaceFlinger للدمج مع وحدة معالجة الرسومات. لا يتم تحسين معظم وحدات معالجة الرسومات لأجل التركيب، وعندما تُنشئ وحدة معالجة الرسومات طبقات من SurfaceFlinger، لا يمكن للتطبيقات استخدام وحدة معالجة الرسومات لعرضها.
يجب أن توفِّر عمليات تنفيذ "مركز الخدمة الرئيسية" ما يلي:
- أربعة تراكبات على الأقل:
- شريط الحالة
- شريط النظام
- التطبيق
- الخلفية
- الطبقات التي تكون أكبر من الشاشة (مثل الخلفية)
- مزج ألفا مضاعفة مسبقًا لكل بكسل ولكل مستوى في الوقت نفسه مزج ألفا
- مسار الجهاز لتشغيل الفيديو المحمي
- طلب التعبئة والتغليف بنموذج أحمر أخضر أزرق وتنسيقات YUV والبلاط والتدوير والتخطي المواقع
لتنفيذ HWC:
- تنفيذ HWC غير تشغيلي وإرسال كل أعمال المقطوعة الموسيقية إلى GLES.
- تنفيذ خوارزمية لتفويض التكوين إلى HWC بشكل تدريجي. على سبيل المثال، يمكنك تفويض السطوح الثلاث أو الأربع الأولى فقط إلى الأجهزة المخصّصة للتراكب في وحدة التحكّم في الأجهزة (HWC).
- تحسين "HWC" وقد يشمل ذلك ما يلي:
- اختيار مساحات العرض التي تزيل أكبر قدر من الحمل عن وحدة معالجة الرسومات وإرسالها إلى وحدة التحكّم في الأجهزة
- رصد ما إذا كان يتم تحديث الشاشة أم لا إذا لم يكن كذلك، قم باستخدام تفويض إلى GLES بدلاً من HWC لتوفير الطاقة. عندما تظهر الشاشة يتم تحديثه مرة أخرى، يمكنك مواصلة نقل التركيبة إلى HWC.
- التحضير لحالات الاستخدام الشائعة مثل:
- الشاشة الرئيسية التي تتضمّن شريط الحالة وشريط النظام ونافذة التطبيق والخلفيات الحية
- ألعاب ملء الشاشة في الوضعَين العمودي والأفقي
- فيديو بملء الشاشة مع ترجمة وشرح وتشغيل التحكّم
- تشغيل الفيديوهات المحمية
- نوافذ متعددة في وضع "تقسيم الشاشة"
عناصر HWC الأساسية
يوفّر HWC عنصرَين أساسيَين، هما الطبقات والشاشات، لتمثيل عمل التركيب وتفاعله مع أجهزة العرض. تشير رسالة الأشكال البيانية توفّر HWC أيضًا إمكانية التحكُّم في VSYNC ومعاودة الاتصال بـ SurfaceFlinger. لإبلاغه عند وقوع حدث VSYNC.
واجهة HIDL
في الإصدار Android 8.0 والإصدارات الأحدث
واجهة HIDL التي تسمى HAL للمؤلف
تنسيق IPC بين HWC وSurfaceFlinger. يحل محل HAL للمؤلف
واجهة hwcomposer2.h
القديمة. في حال وفّر المورِّدون طبقة HAL للمؤلف
تنفيذ HWC، يقبل Composer HAL مباشرةً من طلبات HIDL من
SurfaceFlinger. إذا قدّم المورّدون تنفيذًا قديمًا لـ HWC، في Composer
يحمّل HAL مؤشرات الدالة من hwcomposer2.h
،
إعادة توجيه استدعاءات HIDL إلى استدعاءات مؤشر الوظائف.
يوفر HWC دوال لتحديد خصائص شاشة عرض معينة. إلى التبديل بين إعدادات العرض المختلفة (مثل 4k أو 1080p) درجة الدقة) وأوضاع الألوان (مثل اللون الأصلي أو sRGB الحقيقية) ولتحويل تشغيل الشاشة أو إيقافها أو تحويلها إلى وضع الطاقة المنخفضة إذا كان ذلك متاحًا.
مؤشرات الدوال
إذا نفّذ المورّدون Composer HAL مباشرةً، يستدعي SurfaceFlinger دواله.
من خلال HIDL IPC. على سبيل المثال، لإنشاء طبقة، يُطلِق SurfaceFlinger createLayer()
على Composer HAL.
إذا نفّذ المورّدون واجهة hwcomposer2.h
، سيتم إنشاء HAL في Composer.
لاستدعاء مؤشرات الدوال hwcomposer2.h
. في hwcomposer2.h
تعليق،
دوال واجهة HWC
التي يُشار إليها بأسماء miniCamelCase غير موجودة في الواجهة
كحقول مُسماة. يتم تحميل كل دالة تقريبًا عن طريق طلب
مؤشر الدالة باستخدام getFunction
المقدمة من
hwc2_device_t
على سبيل المثال، الدالة createLayer
هي مؤشر دالة من النوع HWC2_PFN_CREATE_LAYER
، ويتم
عرضها عند تمرير القيمة المُدرَجة HWC2_FUNCTION_CREATE_LAYER
إلى getFunction
.
للحصول على وثائق تفصيلية حول دوال HAL في Composer وعبور دالة HWC
الدوال، يُرجى الاطّلاع على composer
. للحصول على وثائق تفصيلية حول
مؤشرات دالة HWC، راجع
hwcomposer2.h
مقابض الطبقات والعرض
يتم معالجة الطبقات والشاشات من خلال الأسماء المعرِّفة التي يتم إنشاؤها بواسطة HWC. المقابض معتمة لجهاز SurfaceFlinger.
عندما ينشئ SurfaceFlinger طبقة جديدة، يطلق عليها createLayer
،
الذي يكون ناتجًا من النوع Layer
للعمليات المباشرة
أو hwc2_layer_t
لعمليات تنفيذ العبور. فعندما
يعدّل SurfaceFlinger خاصية تلك الطبقة، ويمرر SurfaceFlinger.
قيمة hwc2_layer_t
في دالة التعديل المناسبة
إلى جانب أي معلومات أخرى لازمة لإجراء التعديل. نوع
hwc2_layer_t
كبير بما يكفي لاستيعاب مؤشر أو
فهرس.
يتم إنشاء الشاشات الخارجية من خلال توصيلها بالجهاز. عندما يتم تشغيل شاشة
عندما يكون الجهاز متصلًا بمصدر طاقة، ينشئ مقبضًا ويمرر المقبض إلى SurfaceFlinger.
من خلال الاتصال السريع. من إنشاء SurfaceFlinger الشاشات الافتراضية
جارٍ الاتصال بالرقم createVirtualDisplay()
لطلب شاشة. إذا كان HWC
يتيح إنشاء شاشة افتراضية،
فسيتم عرض مقبض. بعد ذلك، SurfaceFlinger
يفوض أجهزة العرض إلى HWC. إذا لم يكن HWC يتيح
تركيب شاشة العرض، ينشئ SurfaceFlinger المقبض ويركب الشاشة.
عمليات تكوين شاشة العرض
مرة واحدة لكل VSYNC، يتم تنشيط SurfaceFlinger إذا كان هناك محتوى جديد مُركّب. يمكن أن يكون هذا المحتوى الجديد مخازن مؤقتة جديدة للصور من التطبيقات أو حدوث تغيير في خصائص طبقة واحدة أو أكثر. عندما يوقظه SurfaceFlinger:
- تعالج المعاملات، إن وجدت.
- يلتقط التخزين المؤقت الجديد للرسومات، إن وجد.
- يؤدي مقطوعة موسيقية جديدة إذا أدت الخطوة 1 أو 2 إلى تغيير إلى محتوى الشاشة
لتأليف مقطوعة موسيقية جديدة، ينشئ SurfaceFlinger
تدمير الطبقات أو تعدِّل حالات الطبقات، حسب الاقتضاء. إنه يقوم أيضًا بتحديث
مع محتوياتها الحالية، واستخدام استدعاءات مثل
setLayerBuffer
أو setLayerColor
بعد أن تصبح جميع الطبقات
تم تحديثه، يطلب SurfaceFlinger validateDisplay
، والذي يخبر
HWC لفحص حالة الطبقات وتحديد كيفية تفاعل التركيبة
المتابعة. يحاول SurfaceFlinger تلقائيًا ضبط كل طبقة
بحيث يتم دمج الطبقة بواسطة HWC، ولكن في بعض
الظروف، يدمج SurfaceFlinger الطبقات من خلال البديل لوحدة معالجة الرسومات.
بعد الاتصال برقم validateDisplay
، يتصل SurfaceFlinger.
getChangedCompositionTypes
لمعرفة ما إذا كان HWC
يريد أي نوع من أنواع تركيب الطبقات التي تم تغييرها قبل تنفيذ
المقطوعة الموسيقية. لقبول التغييرات، تطلب SurfaceFlinger.
acceptDisplayChanges
إذا تم تحديد أي طبقات لتركيب SurfaceFlinger، يكون SurfaceFlinger
ويضيفها إلى المورد الاحتياطي المستهدف. SurfaceFlinger ثم يستدعي
setClientTarget
لتوفير المخزن المؤقت للشاشة بحيث
يمكن عرض المخزن المؤقت على الشاشة أو تكوينه بشكل أكبر بطبقات
لم يتم وضع علامة عليها لتكوين SurfaceFlinger. إذا لم يتم تحديد أي طبقات
تركيب SurfaceFlinger، يتجاوز SurfaceFlinger خطوة التركيب.
أخيرًا، تستدعي SurfaceFlinger presentDisplay
لإخبار
HWC لإكمال عملية التركيب وعرض النتيجة النهائية.
شاشات عرض متعددة
يتوافق Android 10 مع شاشات عرض مادية متعددة. عند تصميم تنفيذ HWC مخصص للاستخدام على Android 7.0 أعلى، هناك بعض القيود غير الواردة في تعريف HWC:
- من المفترض أن تكون هناك شاشة داخلية واحدة فقط. الفريق الداخلي هي الشاشة التي تقاريرها المقبس السريع الأولي أثناء . بعد توصيل الشاشة الداخلية بمصدر طاقة، سيتعذّر على الشاشة .
- بالإضافة إلى الشاشة الداخلية، قد يتم توصيل أي عدد من الشاشات الخارجية بشكل متصل بالإنترنت.
أثناء التشغيل العادي للجهاز. يفترض إطار العمل أن جميع
مقابس التشغيل السريع بعد أول شاشة داخلية هي شاشات خارجية، لذلك إذا كان هناك
إضافة شاشات داخلية، يتم تصنيفها بشكل غير صحيح على أنها
Display.TYPE_HDMI
بدلاً منDisplay.TYPE_BUILT_IN
أثناء تنفيذ عمليات SurfaceFlinger الموضحة أعلاه لكل عرض، يتم تنفيذها بالتسلسل مع كل الشاشات النشطة حتى إذا تم تحديث محتوى شاشة عرض واحدة فقط.
على سبيل المثال، إذا تم تعديل الشاشة الخارجية، يكون التسلسل على النحو التالي:
// In Android 9 and lower: // Update state for internal display // Update state for external display validateDisplay(<internal display>) validateDisplay(<external display>) presentDisplay(<internal display>) presentDisplay(<external display>) // In Android 10 and higher: // Update state for internal display // Update state for external display validateInternal(<internal display>) presentInternal(<internal display>) validateExternal(<external display>) presentExternal(<external display>)
تركيبة شاشة العرض الافتراضية
تناسُق الشاشة الافتراضية مشابه لتناسُق الشاشة الخارجية. الفرق بين تركيبة شاشة العرض الافتراضية ومادية تركيب شاشة العرض هو أن الشاشات الافتراضية ترسل المخرجات إلى مخزن Gralloc المؤقت بدلاً من الشاشة. ويكتب Device Composer (HWC) الإخراج في مخزن مؤقت، وتوفر حدود الإكمال، وترسل المورد الاحتياطي إلى المستهلك (مثل برنامج ترميز الفيديو ووحدة معالجة الرسومات ووحدة المعالجة المركزية (CPU) وما إلى ذلك). يمكن للشاشات الافتراضية استخدام 2D/Bremeter أو ظهور لوحة مفاتيح في حال كان مسار العرض يكتب إلى الذاكرة.
الأوضاع
يكون كل إطار في أحد الأوضاع الثلاثة بعد أن يستدعي SurfaceFlinger validateDisplay()
طريقة HWC:
- GLES — تجمع وحدة معالجة الرسومات جميع الطبقات، وتكتب مباشرة إلى المخزن المؤقت للمخرج. لا يتدخل HWC في أي تركيبة.
- MIXED — تعمل وحدة معالجة الرسومات على تركيب بعض الطبقات ويركب المخزن المؤقت للإطارات وHWC المخزن المؤقت للإطارات والطبقات المتبقية، الكتابة مباشرة إلى المورد الاحتياطي للمخرجات.
- HWC: يُدمج هذا الوضع جميع الطبقات ويكتبها مباشرةً في ذاكرة التخزين المؤقت للإخراج.
تنسيق الإخراج
تعتمد تنسيقات إخراج المخزن المؤقت للعرض الافتراضي على الوضع الخاص بها:
- وضع GLES: يضبط برنامج تشغيل EGL المخزن المؤقت للإخراج.
بتنسيق
dequeueBuffer()
، عادةًRGBA_8888
. يجب أن يتمكّن المستهلك من قبول تنسيق الإخراج الذي يضبطه برنامج التشغيل أو لا يمكن قراءة المخزن المؤقت. - الوضع المختلط ووضع HWC: إذا احتاج المستهلك إلى وحدة المعالجة المركزية (CPU)
حق الوصول، يقوم المستهلك بتعيين التنسيق. خلاف ذلك، فإن التنسيق هو
ويضبط
IMPLEMENTATION_DEFINED
و Gralloc أفضل تنسيق استنادًا إلى علامات الاستخدام. على سبيل المثال، يضبط Gralloc تنسيق YCbCr إذا كان المستهلك برنامج ترميز الفيديو وHWC كتابة التنسيق بكفاءة.
سياجات المزامنة
حدود المزامنة (المزامنة) هي جانب مهم في رسومات Android . تتيح أسوار تشغيل وحدة المعالجة المركزية (CPU) العمل بشكل مستقل عن عمل وحدة معالجة الرسومات المتزامنة، الحظر فقط عندما يكون هناك تبعية حقيقية.
على سبيل المثال، عندما يرسل أحد التطبيقات موردًا مخزنًا يتم إنشاؤه على وحدة معالجة الرسومات، فإنها ترسل أيضًا كائن حدود المزامنة. يشير هذا الفاصل إلى انتهاء مكتمل عملية الكتابة في ذاكرة التخزين المؤقت من قِبل وحدة معالجة الرسومات.
تتطلّب واجهة برمجة التطبيقات للرسومات عالية الأداء (HWC) أن تنتهي وحدة معالجة الرسومات من كتابة المخزن المؤقت قبل أن يتم عرضه. تمر حدود المزامنة عبر مسار الرسومات مع المخازن المؤقتة والإشارة عند كتابة الموارد الاحتياطية. قبل عرض المخزن المؤقت، يتحقق "المعالج الدقيق للوسائط" مما إذا كان قد تم إرسال إشارة من حاجز المزامنة، وإذا تم ذلك، يعرض المعالج المخزن المؤقت.
لمزيد من المعلومات عن حدود المزامنة، يمكنك الاطّلاع على أداة إنشاء الأجهزة. الدمج: