التعامل مع المكونات الساخنة في Composer HAL

يمكن أن تتغير إمكانات العرض (مثل أوضاع العرض وأنواع HDR المدعومة) ديناميكيًا على الأجهزة التي لها شاشات متصلة خارجيًا (عبر HDMI أو DisplayPort) ، مثل أجهزة فك التشفير لتلفزيون Android (STB) وأجهزة فك التشفير (OTT) الأجهزة. يمكن أن يحدث هذا التغيير نتيجة لإشارة توصيل HDMI ساخنة ، مثل عندما ينتقل المستخدم من شاشة إلى أخرى أو يقوم بتشغيل الجهاز بدون شاشة متصلة. بدءًا من Android 12 وما بعده ، تم إجراء تغييرات في إطار العمل للتعامل مع إمكانات التوصيل السريع والعرض الديناميكي.

تتناول هذه الصفحة كيفية التعامل مع سدادات العرض الساخنة والتغييرات في إمكانيات العرض في تنفيذ Composer HAL. بالإضافة إلى ذلك ، فإنه يناقش كيفية إدارة الإطارات الاحتياطية المرتبطة ومنع ظروف السباق في هذه المواقف.

تحديث قدرات العرض

يصف هذا القسم كيفية تعامل إطار عمل Android مع التغييرات في إمكانات العرض التي بدأها Composer HAL.

قبل أن يتمكن Android من التعامل مع التغييرات في إمكانات العرض بشكل صحيح ، يجب على الشركة المصنعة للمعدات الأصلية (OEM) تنفيذ Composer HAL بحيث يستخدم onHotplug(display, connection=CONNECTED) لإخطار إطار العمل بأي تغييرات في إمكانات العرض. بمجرد تنفيذ ذلك ، يتعامل Android مع التغييرات لإمكانيات العرض على النحو التالي:

  1. عند اكتشاف تغيير في إمكانيات العرض ، يتلقى إطار العمل onHotplug(display, connection=CONNECTED) .
  2. عند تلقي الإشعار ، يسقط إطار العمل حالة العرض الخاصة به ويعيد إنشائها بالإمكانيات الجديدة من HAL باستخدام أساليب getActiveConfig و getDisplayConfigs و getDisplayAttribute و getColorModes و getHdrCapabilities و getDisplayCapabilities .
  3. بمجرد قيام إطار العمل بإعادة إنشاء حالة عرض جديدة ، فإنه يرسل رد الاتصال onDisplayChanged إلى التطبيقات التي تستمع لمثل هذه الأحداث.

يعيد إطار العمل تخصيص الإطارات المؤقتة في onHotplug(display, connection=CONNECTED) . راجع إدارة ذاكرة التخزين المؤقت لإطار الإطارات للحصول على مزيد من المعلومات حول كيفية التعامل مع ذلك.

التعامل مع سيناريوهات الاتصال الشائعة

يغطي هذا القسم كيفية التعامل بشكل صحيح مع سيناريوهات الاتصال المختلفة في عمليات التنفيذ الخاصة بك عند توصيل الشاشة الأساسية وفصلها.

بعد أن تم تصميمه للأجهزة المحمولة ، لا يحتوي إطار عمل Android على دعم مضمن لشاشة أساسية غير متصلة. بدلاً من ذلك ، يجب أن يحل HAL محل العرض الأساسي مع عرض عنصر نائب في تفاعلاته مع إطار العمل في الحالة التي يكون فيها العرض الأساسي غير متصل فعليًا.

يمكن أن تحدث السيناريوهات التالية في أجهزة فك التشفير ووحدات دونجل التلفزيون التي تحتوي على شاشات متصلة خارجيًا يمكن فصلها. من أجل تنفيذ الدعم لهذه السيناريوهات ، استخدم المعلومات الواردة في الجدول أدناه:

سيناريو معالجة
لا توجد شاشة متصلة في وقت التمهيد
  • أرسل إشارة onHotplug(display, connection=CONNECTED) من Composer HAL إلى إطار العمل.
  • استبدل حالة العرض الفعلية داخل Composer HAL بحالة عرض العنصر النائب.

    ملاحظة: نوصي بأن يكون لشاشة العنصر النائب وضع واحد مدعوم بدقة 1080 × 1920 ومعدل تحديث 60 هرتز ، لأن وضع العرض هذا مدعوم من قبل معظم التطبيقات.

العرض الأساسي متصل فعليًا
العرض الأساسي مفصول ماديًا
  • أرسل onHotplug(display, connection=CONNECTED) من Composer HAL إلى إطار العمل.
  • استبدل حالة العرض الفعلية داخل Composer HAL بحالة عرض العنصر النائب. يجب أن يكون لعرض العنصر النائب وضع عرض واحد ، بحيث يرسل إطار العمل رد onDisplayChanged إلى التطبيقات (منذ أن تغيرت مجموعة الأوضاع المدعومة). يجب أن يتطابق وضع العرض الفردي هذا مع آخر وضع نشط للشاشة المادية قبل قطع الاتصال ، بحيث لا تتلقى التطبيقات أحداث تغيير التكوين .

إدارة ذاكرة التخزين المؤقت

عندما تتلقى شاشة متصلة بالفعل حدث onHotplug(display, connection=CONNECTED) ، يعيد إطار العمل تخصيص الإطارات المؤقتة المرتبطة بهذه الشاشة. يجب أن تتوقع تطبيقات الجهاز هذا السلوك وإدارة ذاكرة التخزين المؤقت للإطار بشكل صحيح. استخدم الإرشادات التالية في التنفيذ:

  • قبل إرسال أحداث إشعار onHotplug(display, connection=CONNECTED) اللاحقة ، تأكد من تحرير المقابض إلى الإطارات الاحتياطية بحيث يمكن للنظام إلغاء تخصيصها بشكل صحيح ، قبل إعادة تخصيصها. إذا لم تنجح عملية إلغاء التخصيص ، فقد تفشل إعادة التخصيص بسبب نقص الذاكرة.

  • نوصي بتخصيص مجموعة ذاكرة مخصصة للمخزونات المؤقتة للإطارات منفصلة عن بقية المخزن المؤقت لذاكرة الرسوم.

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

استخدام معرفات التكوين التسلسلي لمنع ظروف السباق

يمكن أن تظهر شروط العرق إذا قام Composer HAL بتحديث تكوينات العرض المدعومة بشكل متزامن مع إطار العمل الذي يستدعي setActiveConfig أو setActiveConfigWithConstraints . الحل هو تنفيذ Composer HAL لاستخدام معرفات متسلسلة ومنع حدوث هذه المشكلة.

يصف هذا القسم كيفية حدوث ظروف السباق ، متبوعة بتفاصيل حول كيفية تنفيذ Composer HAL بحيث يستخدم معرفات متسلسلة لمنع مثل هذه الظروف.

ضع في اعتبارك التسلسل التالي للأحداث ، عندما لا يتم تعيين معرفات متسلسلة جديدة لتكوينات العرض الجديدة ، مما يتسبب في حالة سباق:

  1. معرّفات تكوين العرض المدعومة هي:

    • المعرف = 1 ، 1080 × 1920 60 هرتز
    • المعرف = 2 ، 1080 × 1920 50 هرتز
  2. يستدعي إطار العمل setActiveConfig(display, config=1) .

  3. في الوقت نفسه ، يقوم Composer HAL بمعالجة تغيير تكوينات العرض وتحديث حالته الداخلية إلى مجموعة جديدة من تكوينات العرض ، كما هو موضح على النحو التالي:

    • معرف = 1 ، 2160 × 3840 60 هرتز
    • المعرف = 2 ، 2160 × 3840 50 هرتز
    • المعرف = 3 ، 1080 × 1920 60 هرتز
    • المعرف = 4 ، 1080 × 1920 50 هرتز
  4. يرسل Composer HAL حدث onHotplug إلى إطار العمل ، لإعلام أن مجموعة الأوضاع المدعومة قد تغيرت.

  5. يستقبل Composer HAL setActiveConfig(display, config=1) (من الخطوة 2).

  6. يفسر HAL أن إطار العمل قد طلب تغيير التكوين إلى 2160x3840 60 هرتز ، على الرغم من أنه في الواقع كان المطلوب 1080x1920 60 هرتز .

تنتهي العملية التي تستخدم تعيينات المعرف غير المتسلسلة هنا بتفسير خاطئ لتغيير التكوين المطلوب.

تكوين Composer HAL لاستخدام معرفات متسلسلة

لتجنب حالات السباق هذه ، يجب على الشركة المصنعة للمعدات الأصلية (OEM) تنفيذ Composer HAL على النحو التالي:

  • عندما يقوم Composer HAL بتحديث تكوينات العرض المدعومة ، فإنه يقوم بتعيين معرفات جديدة ومتسلسلة لتكوينات العرض الجديدة.
  • عندما يستدعي إطار العمل setActiveConfig أو setActiveConfigWithConstraints تكوين غير صالح ، يتجاهل Composer HAL المكالمة.

تعمل هذه الخطوات على منع ظروف السباق كما هو موضح في المناقشة التالية.

ضع في اعتبارك التسلسل التالي للأحداث ، عند تعيين معرفات متسلسلة جديدة لتكوينات العرض الجديدة:

  1. معرّفات تكوين العرض المدعومة هي:

    • المعرف = 1 ، 1080 × 1920 60 هرتز
    • المعرف = 2 ، 1080 × 1920 50 هرتز
  2. يستدعي إطار العمل setActiveConfig(display, config=1) .

  3. عند معالجة تغيير في إعدادات العرض ، يتم تعيين المجموعة التالية من معرفات التكوين بدءًا من العدد الصحيح التالي غير المستخدم ، كما هو موضح على النحو التالي:

    • معرف = 3 ، 2160 × 3840 60 هرتز

    • معرف = 4 ، 2160 × 3840 50 هرتز

    • المعرف = 5 ، 1080 × 1920 60 هرتز

    • المعرف = 6 ، 1080 × 1920 50 هرتز

  4. يرسل Composer HAL حدث onHotplug إلى إطار العمل ، لإعلام أن مجموعة الأوضاع المدعومة قد تغيرت.

  5. يستقبل Composer HAL setActiveConfig(display, config=1) (من الخطوة 2).

  6. يتجاهل Composer HAL المكالمة لأن المعرف لم يعد صالحًا.

  7. يستقبل إطار العمل ويعالج حدث onHotplug من الخطوة 4. ويستدعي Composer HAL باستخدام الدالتين getDisplayConfigs و getDisplayAttribute . من خلال هذه الوظائف ، يحدد إطار العمل المعرف الجديد (5) للدقة المطلوبة ومعدل التحديث 1080 × 1920 و 60 هرتز.

  8. يرسل إطار العمل حدث setActiveConfig آخر بمعرّف محدث 5.

  9. يستقبل Composer HAL setActiveConfig(display, config=5) من الخطوة 5.

  10. يفسر HAL بشكل صحيح أن إطار العمل قد طلب تغيير التكوين إلى 1080x1920 60hz.

كما هو موضح في المثال أعلاه ، تضمن العملية التي تستخدم تعيينات المعرف التسلسلي منع حالة السباق وتحديث تغيير تكوين العرض الصحيح.