يُجمِّع "واجهة برمجة التطبيقات لبرنامج Hardware Composer (HWC)" الطبقات التي يتم استلامها من SurfaceFlinger، ما يقلل من مقدار التركيب الذي يؤديه OpenGL ES (GLES) ووحدة معالجة الرسومات.
تُلخِّص واجهة برمجة التطبيقات HWC العناصر، مثل العناصر التي تظهر على سطح الشاشة وأدوات معالجة الصور ثنائية الأبعاد، لتركيب السطوح والتواصل مع الأجهزة المخصّصة لتركيب النوافذ بهدف تركيب النوافذ. يمكنك استخدام HWC مع النوافذ المركّبة بدلاً من وجود مركب SurfaceFlinger مع وحدة معالجة الرسومات. لا يتم تحسين معظم وحدات معالجة الرسومات لأجل التركيب، وعندما تُنشئ وحدة معالجة الرسومات طبقات من SurfaceFlinger، لا يمكن للتطبيقات استخدام وحدة معالجة الرسومات لعرضها.
يجب أن تتيح عمليات تنفيذ HWC ما يلي:
- أربعة تراكبات على الأقل:
- شريط الحالة
- شريط النظام
- التطبيق
- الخلفية/الخلفية
- الطبقات التي تكون أكبر من الشاشة (مثل الخلفية)
- مزج ألفا مضاعفة مسبقًا لكل بكسل ولكل مستوى في الوقت نفسه مزج ألفا
- مسار الجهاز لتشغيل الفيديو المحمي
- طلب التعبئة والتغليف بنموذج أحمر أخضر أزرق وتنسيقات YUV والبلاط والتدوير والتخطي المواقع
لتنفيذ ميزة "المعالجة عالية السرعة":
- تنفيذ وحدة معالجة رسومات عالية الأداء غير عاملة وإرسال جميع أعمال التركيب إلى GLES
- تنفيذ خوارزمية لتفويض التكوين إلى HWC بشكل تدريجي. على سبيل المثال، يمكنك تفويض السطوح الثلاث أو الأربع الأولى فقط إلى الأجهزة المخصّصة للتراكب في وحدة التحكّم في الأجهزة (HWC).
- تحسين "المعالجة السخونة العالية" وقد يشمل ذلك ما يلي:
- اختيار مساحات العرض التي تزيل أكبر قدر من الحمل عن وحدة معالجة الرسومات وإرسالها إلى وحدة التحكّم في الأجهزة
- رصد ما إذا كان يتم تحديث الشاشة أم لا وإذا لم يكن كذلك، يمكنك تفويض عملية التركيب إلى GLES بدلاً من HWC لتوفير الطاقة. عندما تظهر الشاشة يتم تحديثه مرة أخرى، يمكنك مواصلة نقل التركيبة إلى HWC.
- التحضير لحالات الاستخدام الشائعة مثل:
- الشاشة الرئيسية التي تتضمّن شريط الحالة وشريط النظام ونافذة التطبيق والخلفيات الحية
- ألعاب ملء الشاشة في الوضعَين العمودي والأفقي
- فيديو بملء الشاشة مع ترجمة وشرح وتشغيل التحكّم
- تشغيل الفيديوهات المحمية
- نوافذ متعددة في وضع "تقسيم الشاشة"
عناصر HWC الأساسية
يوفر HWC قاعدتين، طبقتين وشاشات عرض، أعمال التركيب وتفاعلها مع أجهزة العرض. تشير رسالة الأشكال البيانية توفّر HWC أيضًا إمكانية التحكّم في VSYNC ومعاودة الاتصال بـ SurfaceFlinger. لإبلاغه عند وقوع حدث VSYNC.
واجهة HIDL
في الإصدار Android 8.0 والإصدارات الأحدث
واجهة HIDL التي تسمى HAL للمؤلف
تنسيق IPC بين HWC وSurfaceFlinger. يحل محل HAL للمؤلف
واجهة hwcomposer2.h
القديمة. إذا قدّم المورّدون تنفيذًا لواجهة برمجة التطبيقات Composer HAL لوحدة التحكّم في الأجهزة (HWC)، ستقبل واجهة برمجة التطبيقات Composer HAL مباشرةً طلبات HIDL من واجهة برمجة التطبيقات
SurfaceFlinger. إذا كان المورّدون يوفّرون تنفيذًا قديمًا لواجهة HWC، يحمِّل Composer
HAL مؤشرات الدوال من hwcomposer2.h
، ويوجّه استدعاءات HIDL إلى استدعاءات مؤشرات الدوال.
توفّر HWC دوال لتحديد خصائص شاشة عرض معيّنة. إلى التبديل بين إعدادات العرض المختلفة (مثل 4k أو 1080p) درجة الدقة) وأوضاع الألوان (مثل اللون الأصلي أو sRGB الحقيقية) ولتحويل تشغيل الشاشة أو إيقافها أو تحويلها إلى وضع الطاقة المنخفضة إذا كان ذلك متاحًا.
مؤشرات الدوال
إذا نفَّذ المورّدون واجهة برمجة التطبيقات Composer HAL مباشرةً، يُطلِق SurfaceFlinger وظائفه
من خلال HIDL IPC. على سبيل المثال، لإنشاء طبقة، يستدعي SurfaceFlinger
createLayer()
على 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
.
مقابض الطبقات والعرض
يتمّ التحكّم في الطبقات والشاشات باستخدام الأسماء المعرِّفة التي أنشأها "المعالج اللاسلكي للوسائط". المقابض معتمة لجهاز SurfaceFlinger.
عندما ينشئ SurfaceFlinger طبقة جديدة، يطلق عليها createLayer
،
الذي يكون ناتجًا من النوع Layer
للعمليات المباشرة
أو hwc2_layer_t
لعمليات تنفيذ العبور. عندما يعدِّل
SurfaceFlinger إحدى سمات هذه الطبقة، يُرسِل
SurfaceFlinger قيمة hwc2_layer_t
إلى دالة التعديل المناسبة
بالإضافة إلى أي معلومات أخرى مطلوبة لإجراء التعديل. نوع
hwc2_layer_t
كبير بما يكفي لاستيعاب مؤشر أو
فهرس.
يتم إنشاء الشاشات المادية من خلال التوصيل المباشر. عند توصيل شاشة خارجية
باستخدام تقنية hotplug، ينشئ HWC معرّفًا ويمرّره إلى SurfaceFlinger
من خلال دالة الاستدعاء hotplug. من إنشاء SurfaceFlinger الشاشات الافتراضية
جارٍ الاتصال بالرقم createVirtualDisplay()
لطلب شاشة. إذا كان HWC
يتيح إنشاء شاشة افتراضية،
فسيتم عرض مقبض. بعد ذلك، SurfaceFlinger
يفوض أجهزة العرض إلى HWC. إذا لم يكن HWC يتيح
تركيب شاشة العرض، ينشئ SurfaceFlinger المقبض ويركب الشاشة.
عمليات تكوين شاشة العرض
مرة واحدة لكل VSYNC، يتم تنشيط SurfaceFlinger إذا كان هناك محتوى جديد مُركب. يمكن أن يكون هذا المحتوى الجديد ذاكرة تخزين مؤقتة جديدة للصور من التطبيقات أو تغييرًا في سمات طبقة واحدة أو أكثر. عند استخدام SurfaceFlinger يوقظه:
- يعالج المعاملات، إن توفّرت.
- يُقفل هذا الخيار وحدات تخزين مؤقتة جديدة للرسومات، إن توفّرت.
- يؤدي مقطوعة موسيقية جديدة إذا أدت الخطوة 1 أو 2 إلى تغيير إلى محتوى الشاشة
لتنفيذ تركيبة جديدة، ينشئ SurfaceFlinger طبقات ويدمرها أو يعدّل حالاتها، حسب الاقتضاء. ويُعدّل أيضًا
الطبقات باستخدام محتوياتها الحالية، باستخدام طلبات مثل
setLayerBuffer
أو setLayerColor
. بعد أن تصبح جميع الطبقات
تم تحديثه، يطلب SurfaceFlinger validateDisplay
، والذي يخبر
HWC لفحص حالة الطبقات وتحديد كيفية تفاعل التركيبة
المتابعة. يحاول SurfaceFlinger ضبط كل طبقة بشكل تلقائي
بحيث تتكوّن الطبقة بواسطة HWC، رغم ذلك في بعض
الظروف، يقوم SurfaceFlinger بتركيب الطبقات من خلال الإجراء الاحتياطي لوحدة GPU.
بعد الاتصال برقم validateDisplay
، يتصل SurfaceFlinger.
getChangedCompositionTypes
لمعرفة ما إذا كان HWC
يريد أي نوع من أنواع تركيب الطبقات التي تم تغييرها قبل تنفيذ
المقطوعة الموسيقية. لقبول التغييرات، تطلب SurfaceFlinger.
acceptDisplayChanges
إذا تم تحديد أي طبقات لتركيب SurfaceFlinger، يكون SurfaceFlinger
ويضيفها إلى المورد الاحتياطي المستهدف. SurfaceFlinger ثم يستدعي
setClientTarget
لتوفير المخزن المؤقت للشاشة بحيث
يمكن عرض المخزن المؤقت على الشاشة أو تكوينه بشكل أكبر بطبقات
لم يتم وضع علامة عليها لتكوين SurfaceFlinger. إذا لم يتم وضع علامة على أي طبقات لعملية تركيب
SurfaceFlinger، سيتخطّى SurfaceFlinger خطوة التركيب.
أخيرًا، تستدعي SurfaceFlinger presentDisplay
لإخبار
HWC لإكمال عملية التركيب وعرض النتيجة النهائية.
شاشات متعددة
يتوافق Android 10 مع شاشات عرض مادية متعددة. عند تصميم تنفيذ HWC مخصص للاستخدام على Android 7.0 أعلى، هناك بعض القيود غير الواردة في تعريف HWC:
- من المفترض أن تكون هناك شاشة داخلية واحدة فقط. الشاشة الداخلية هي الشاشة التي تُبلغ عنها ميزة hotplug الأولية أثناء التشغيل. بعد توصيل الشاشة الداخلية، لا يمكن فصلها.
- بالإضافة إلى الشاشة الداخلية، يمكن توصيل أي عدد من الشاشات الخارجية أثناء التشغيل العادي للجهاز. يفترض إطار العمل أنّ جميع عمليات ربط الأجهزة بالطاقة بعد أول شاشة داخلية هي شاشات خارجية، لذا إذا تمت إضافة أي مزيد من الشاشات الداخلية، سيتم تصنيفها بشكل غير صحيح على أنّها
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) ملف التخزين المؤقت للصور والطبقات المتبقية، ثم تُجري عملية الكتابة مباشرةً إلى ذاكرة التخزين المؤقت للإخراج.
- HWC: يُدمج هذا الوضع جميع الطبقات ويكتبها مباشرةً في ذاكرة التخزين المؤقت للإخراج.
تنسيق الإخراج
تعتمد تنسيقات الإخراج لوحدة تخزين العرض الافتراضي على وضعها:
- وضع GLES: يضبط برنامج تشغيل EGL المخزن المؤقت للإخراج.
بتنسيق
dequeueBuffer()
، عادةًRGBA_8888
. يجب أن يتمكّن المستهلك من قبول تنسيق الإخراج الذي يضبطه برنامج التشغيل أو لا يمكن قراءة المخزن المؤقت. - وضعا MIXED وHWC: إذا كان المستهلك بحاجة إلى الوصول إلى وحدة المعالجة المركزية، يضبط المستهلك التنسيق. خلاف ذلك، فإن التنسيق هو
ويضبط
IMPLEMENTATION_DEFINED
و Gralloc أفضل تنسيق استنادًا إلى علامات الاستخدام. على سبيل المثال، يضبط Gralloc تنسيق YCbCr إذا كان المستهلك هو برنامج ترميز الفيديو ويمكن لوحدة HWC كتابة التنسيق بكفاءة.
حدود المزامنة
تشكل حدود المزامنة (المزامنة) جانبًا مهمًا من نظام رسومات Android . تتيح أسوار تشغيل وحدة المعالجة المركزية (CPU) العمل بشكل مستقل عن عمل وحدة معالجة الرسومات المتزامنة، الحظر فقط عندما يكون هناك تبعية حقيقية.
على سبيل المثال، عندما يُرسِل تطبيق ذاكرة تخزين مؤقت يتم إنشاؤها على GPU، يُرسِل أيضًا عنصر حدود مزامنة. يشير هذا السياج إلى الوقت الذي انتهت وحدة معالجة الرسومات من الكتابة في المخزن المؤقت.
يتطلب HWC أن تنتهي وحدة معالجة الرسومات من كتابة الموارد الاحتياطية قبل المعروضة. يتم تمرير حدود المزامنة من خلال مسار الرسومات باستخدام المخزن المؤقت والإشارات عند كتابة المخزن المؤقت. قبل عرض المخزن المؤقت، يتحقق "المعالج الدقيق للوسائط" مما إذا كان قد تم إرسال إشارة من حاجز المزامنة، وإذا تم ذلك، يعرض المعالج المخزن المؤقت.
لمزيد من المعلومات عن حدود المزامنة، يُرجى الاطّلاع على مقالة دمج Hardware Composer .