Android 10 في ميزات اختيارية المخزن المؤقت للكاميرا HAL3 إدارة واجهات برمجة التطبيقات (API) التي تسمح لك تنفيذ منطق إدارة المخزن المؤقت للحصول على ذاكرة مختلفة المفاضلات ضمن وقت الاستجابة في عمليات تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا
تتطلب طبقة تجريد الأجهزة (HAL) للكاميرا طلبات N (حيث تساوي N عمق خط الأنابيب) وضعها في قائمة الانتظار، لكنها غالبًا لا تتطلب جميع مجموعات N الموارد الاحتياطية للمخرجات في نفس الوقت.
على سبيل المثال، قد يكون لدى HAL ثمانية طلبات في قائمة الانتظار في مسار التنفيذ، ولكن لا يتطلب سوى موارد احتياطية للمخرجات للطلبين في المراحل الأخيرة من المشروع. على الأجهزة التي تعمل بنظام التشغيل Android 9 والإصدارات الأقدم، يخصّص إطار عمل الكاميرا التخزين المؤقت عند وضع الطلب في قائمة الانتظار في HAL بحيث يمكن أن يكون هناك ست مجموعات من والموارد الاحتياطية في HAL غير المستخدمة. في نظام Android 10، تسمح واجهات برمجة التطبيقات لإدارة المخزن المؤقت HAL3 للكاميرا بفصل الإخراج الموارد الاحتياطية لتحرير المجموعات الست من الموارد الاحتياطية. هذا يمكن أن يؤدي إلى مئات ميجابايت من الذاكرة التي تم توفيرها على الأجهزة المتطورة ويمكن أن يكون مفيدًا أيضًا الأجهزة منخفضة الذاكرة.
يعرض الشكل 1 مخطّطًا بيانيًا لواجهة HAL للكاميرا في الأجهزة التي تعمل الإصدار 9 من نظام Android والإصدارات الأقدم الشكل 2 يعرض واجهة HAL للكاميرا في نظام Android 10 مع تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت HAL3 للكاميرا.
الشكل 1. واجهة HAL للكاميرا في Android 9 والإصدارات الأقدم
الشكل 2. واجهة HAL للكاميرا في Android 10 باستخدام واجهات برمجة التطبيقات لإدارة التخزين المؤقت
تنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت
لتنفيذ واجهات برمجة التطبيقات لإدارة المخزن المؤقت، يجب أن تستوفي طبقة تجريد الأجهزة (HAL) للكاميرا ما يلي:
- تنفيذ شهادة HIDL
ICameraDevice@3.5
- ضبط مفتاح خصائص الكاميرا
android.info.supportedBufferManagementVersion
إلىHIDL_DEVICE_3_5
.
تستخدم طبقة تجريد الأجهزة (HAL) للكاميرا
requestStreamBuffers
أو
returnStreamBuffers
الطرق في
ICameraDeviceCallback.hal
لطلب الموارد الاحتياطية وإرجاعها. يجب أن تنفذ HAL أيضًا
signalStreamFlush
إجراء
ICameraDeviceSession.hal
لإرسال إشارة إلى طبقة تجريد الأجهزة (HAL) للكاميرا لإظهار الموارد الاحتياطية.
طلب StreamBuffers
يمكنك استخدام
requestStreamBuffers
لطلب الموارد الاحتياطية من إطار عمل الكاميرا. عند استخدام كاميرا HAL3
واجهات برمجة التطبيقات لإدارة الموارد المخزنة مؤقتًا، لا يتم إجراء طلبات الالتقاط من إطار عمل الكاميرا
يحتوي على مخازن مؤقتة للمخرجات، أي الحقل bufferId
في
StreamBuffer
يبلغ 0
لذلك، يجب أن تستخدم طبقة تجريد الأجهزة (HAL) للكاميرا requestStreamBuffers
لطلب
والموارد الاحتياطية من إطار عمل الكاميرا.
تسمح الطريقة requestStreamBuffers
للمتصل بطلب مخازن مؤقتة متعددة.
من مجموعات بث إخراج متعددة في مكالمة واحدة، ما يسمح بتقليل بروتوكول HIDL IPC
الاتصالات. ومع ذلك، تستغرق الاستدعاءات وقتًا أطول عند طلب المزيد من الموارد الاحتياطية
الوقت نفسه، ما قد يؤثر سلبًا في إجمالي وقت استجابة الطلب إلى النتيجة.
بالإضافة إلى ذلك، لأنّ المكالمات الواردة إلى requestStreamBuffers
متسلسلة داخل الكاميرا.
يوصى بأن تستخدم طبقة تجريد الأجهزة (HAL) للكاميرا مستوى أولوية عالية
لطلب الموارد الاحتياطية.
في حال تعذُّر طلب المخزن المؤقت، يجب أن تكون طبقة تجريد الأجهزة (HAL) للكاميرا قادرة على التعامل بشكل صحيح الأخطاء غير الفادحة. توضح القائمة التالية الأسباب الشائعة التي تؤدي إلى فشل الطلبات وكيفية التعامل معها بواسطة طبقة تجريد الأجهزة (HAL) للكاميرا.
- إلغاء ربط التطبيق بمصدر البيانات:
هذا خطأ غير فادح. ينبغي أن يرسل طبقة تجريد الأجهزة (HAL) للكاميرا
ERROR_REQUEST
لأي طلب تصوير استهداف بث غير متّصل والاستعداد لمعالجة الطلبات اللاحقة بشكل طبيعي. - المهلة: يمكن أن يحدث ذلك عندما يكون التطبيق مشغولاً.
معالجة مكثفة مع الاحتفاظ ببعض الموارد الاحتياطية. ينبغي أن تكون طبقة تجريد الأجهزة (HAL) للكاميرا
إرسال
ERROR_REQUEST
لطلبات الالتقاط التي لا يمكن تنفيذها بسبب خطأ في المهلة والاستعداد لمعالجة الطلبات اللاحقة بشكل طبيعي. - يتم الآن إعداد إطار عمل الكاميرا لإعداد بث جديد:
من المفترض أن تنتظر طبقة تجريد الأجهزة (HAL) للكاميرا حتى
configureStreams
اكتملت المكالمة قبل الاتصال بـrequestStreamBuffers
مرة أخرى. - وصلت طبقة تجريد الأجهزة (HAL) للكاميرا إلى
الحد الأقصى للمخزن المؤقت
(الحقل
maxBuffers
): من المفترض أن تنتظر طبقة تجريد الأجهزة (HAL) للكاميرا إلى أن يعرض مخزنًا مؤقتًا واحدًا على الأقل للبث قبل الاتصالrequestStreamBuffers
مرة أخرى.
returnStreamBuffers
يمكنك استخدام
returnStreamBuffers
لإعادة الموارد الاحتياطية الإضافية إلى إطار عمل الكاميرا. طبقة تجريد الأجهزة (HAL) للكاميرا بشكل طبيعي
تعمل على إرجاع الموارد الاحتياطية إلى إطار عمل الكاميرا من خلال
processCaptureResult
ولكنها يمكن أن تراعي فقط طلبات الالتقاط التي تم إرسالها إلى
طبقة تجريد الأجهزة (HAL) للكاميرا. باستخدام الطريقة requestStreamBuffers
، يمكن
تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا للاحتفاظ بوحدات تخزين احتياطية أكثر مما تم طلبه
إطار عمل الكاميرا. هذا هو الوقت المناسب لإجراء returnStreamBuffers
استخدام البيانات المختلفة. فإذا لم تتضمن عملية تنفيذ HAL موارد احتياطية أكثر مما هو مطلوب،
لا يتطلّب تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا طلب returnStreamBuffers
.
.
SignStreamFlush
تشير رسالة الأشكال البيانية
signalStreamFlush
بواسطة إطار عمل الكاميرا لإعلام طبقة تجريد الأجهزة (HAL) للكاميرا بعرض جميع
والموارد الاحتياطية المتاحة. ويستدعي ذلك عادةً عندما يكون إطار عمل الكاميرا على وشك
مكالمة
configureStreams
ويجب أن يستنزف مسار التقاط الكاميرا. تماثِل returnStreamBuffers
إذا كان تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا لا يحتوي على مخازن مؤقتة أكثر من
مطلوب، يمكن أن يكون هناك تنفيذ فارغ لهذه الطريقة.
بعد استدعاء إطار عمل الكاميرا
signalStreamFlush
،
يتوقف إطار العمل عن إرسال طلبات التقاط جديدة إلى طبقة تجريد الأجهزة (HAL) للكاميرا حتى
تم إعادة الموارد الاحتياطية إلى إطار عمل الكاميرا. عندما يتم
تمت إعادتها، وتفشل طلبات طريقة requestStreamBuffers
، وتتعذر على الكاميرا
إطار العمل يمكنها مواصلة عمله في حالة نظيفة. يعمل إطار عمل الكاميرا بعد ذلك
يستدعي إما
configureStreams
أو
processCaptureRequest
. إذا كان إطار عمل الكاميرا يستدعي الطريقة configureStreams
، ستعمل الكاميرا
يمكن أن تبدأ عملية HAL في طلب الموارد الاحتياطية مرة أخرى بعد عودة مكالمة configureStreams
بنجاح. إذا استدعينا إطار عمل الكاميرا الطريقة processCaptureRequest
،
يمكن أن تبدأ طبقة تجريد الأجهزة (HAL) للكاميرا في طلب موارد احتياطية خلال processCaptureRequest
الاتصال.
تختلف الدلالة حسب طريقة signalStreamFlush
flush
. عند استدعاء طريقة flush
، يمكن لـ HAL إلغاء الالتقاط المعلّق
الطلبات عبر
ERROR_REQUEST
لتصريف الأنابيب في أسرع وقت ممكن. فعندما
يتم استدعاء طريقة signalStreamFlush
، يجب أن تُكمل HAL جميع الاقتراحات
التقاط الطلبات بشكل طبيعي وإعادة جميع الموارد الاحتياطية إلى إطار عمل الكاميرا.
هناك اختلاف آخر بين طريقة signalStreamFlush
والطرق الأخرى
أنّ signalStreamFlush
هي طريقة لاتجاه HIDL، ما يعني أنّ الكاميرا
إلى واجهات برمجة تطبيقات حظر أخرى قبل أن تتلقى HAL
مكالمة signalStreamFlush
. هذا يعني أنّ
طريقة signalStreamFlush
وغيرها من الطرق (وخصوصًا
configureStreams
طريقة) قد تصل إلى طبقة تجريد الأجهزة (HAL) للكاميرا بترتيب مختلف
من الترتيب الذي تم استدعاؤه في إطار الكاميرا. لحلّ هذه المشكلة
مشكلة غير متزامنة، تمت إضافة الحقل streamConfigCounter
إلى
StreamConfiguration
وتمت إضافتها كوسيطة إلى signalStreamFlush
. يجب أن يستخدِم تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا streamConfigCounter
لتحديد ما إذا كانت مكالمة signalStreamFlush
ستصل بعد وقت ظهورها
مكالمة configureStreams
المقابلة لها. انظر الشكل 3 للحصول على مثال.
الشكل 3. الطريقة التي يجب أن ترصد بها طبقة تجريد الأجهزة (HAL) الكاميرا وتتعامل معها
تغييرات السلوك عند تنفيذ واجهات برمجة تطبيقات إدارة المخزن المؤقت
عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت لتطبيق منطق إدارة المخزن المؤقت، مراعاة التغييرات المحتملة التالية في السلوك على الكاميرا تنفيذ طبقة تجريد الأجهزة (HAL) للكاميرا:
وصول طلبات الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا بشكل أسرع وأكثر بشكل متكرّر: بدون واجهات برمجة تطبيقات إدارة المخزن المؤقت، يطلب إطار عمل الكاميرا الموارد الاحتياطية للمخرجات لكل طلب التقاط قبل إرسال طلب الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا. عند استخدام واجهات برمجة تطبيقات إدارة المخزن المؤقت، فإن إطار عمل الكاميرا لم تعد بحاجة إلى انتظار الموارد الاحتياطية وبالتالي يمكنها إرسال طلبات الالتقاط إلى طبقة تجريد الأجهزة (HAL) للكاميرا سابقًا.
وأيضًا، بدون وجود واجهات برمجة تطبيقات لإدارة المخزن المؤقت، يتوقف إطار عمل الكاميرا يرسلون طلبات الالتقاط إذا كان أحد ساحات إخراج الالتقاط طلبك إلى الحد الأقصى لعدد الموارد الاحتياطية التي يمكن أن تحتفظ بها HAL مرة واحدة (يتم تحديد هذه القيمة بواسطة طبقة تجريد الأجهزة (HAL) للكاميرا في الحقل
HalStream::maxBuffers
في القيمة المعروضة لـconfigureStreams
الاتصال). باستخدام واجهات برمجة التطبيقات الخاصة بإدارة المخزن المؤقت، لم يعُد سلوك التقييد هذا الحالية ويجب ألا يتم قبول تنفيذ HAL للكاميرا مكالمتان (processCaptureRequest
) عند وجود عدد كبير جدًا من طلبات الالتقاط في HAL في قائمة الانتظار.يتفاوت وقت استجابة المكالمات
requestStreamBuffers
بشكل كبير: هناك هناك العديد من الأسباب التي قد تؤدي إلى استغراق مكالمةrequestStreamBuffers
وقتًا أطول من المتوسط. مثلاً:- بالنسبة إلى الموارد الاحتياطية القليلة الأولى للبث الذي تم إنشاؤه حديثًا، يمكن إجراء يمكن أن يستغرق وقتًا أطول لأن الجهاز يحتاج إلى تخصيص ذاكرة.
- يزيد وقت الاستجابة المتوقع بالتناسب مع عدد الموارد الاحتياطية المطلوبة في كل استدعاء.
- يتوفّر على التطبيق مخازن مؤقتة وهو مشغول بالمعالجة. هذا النمط إلى إبطاء طلبات المخزن المؤقت أو انتهاء المهلة بسبب نقص الموارد الاحتياطية أو انشغال وحدة المعالجة المركزية (CPU).
استراتيجيات إدارة الموارد الاحتياطية
تسمح واجهات برمجة التطبيقات لإدارة المخزن المؤقت بأنواع مختلفة من إدارة المخزن المؤقت والاستراتيجيات المراد تنفيذها. تشمل بعض الأمثلة:
- التوافق مع الأنظمة القديمة: تطلب طبقة تجريد الأجهزة (HAL) مستودعات احتياطية لطلب تسجيل المحتوى.
أثناء مكالمة
processCaptureRequest
. لا توفر هذه الإستراتيجية أي مقدار التوفير في الذاكرة، ولكن يمكن أن يكون بمثابة أول تنفيذ للمخزن المؤقت إلا أن ذلك يتطلب تغييرات قليلة جدًا في رمز طبقة تجريد الأجهزة (HAL) للكاميرا الحالية. - زيادة التوفير في الذاكرة إلى أقصى حد: لا تطلب طبقة تجريد الأجهزة (HAL) للكاميرا سوى مخازن مؤقتة للمخرجات يجب ملء أحدهما مباشرة. تسمح هذه الإستراتيجية توفير أكبر في الذاكرة. يتمثل الجانب السلبي المحتمل في زيادة مسار الكاميرا إيقاف مؤقت عندما تستغرق طلبات المخزن المؤقت وقتًا طويلاً غير معتاد إلى أن تكتمل.
- نسخة مخبأة: تُخزِّن طبقة تجريد الأجهزة (HAL) بعض المخازن المؤقتة في الكاميرا بحيث يقلّ احتمال طلب مخزن مؤقت بطيء من حين لآخر.
ويمكن أن يتبنى طبقة تجريد الأجهزة (HAL) للكاميرا استراتيجيات مختلفة لحالات استخدام معينة، مثلًا، استخدام الإستراتيجية القصوى لتوفير الذاكرة لحالات الاستخدام التي تستهلك قدرًا كبيرًا من من الذاكرة واستخدام الإستراتيجية المتوافقة مع الأنظمة القديمة لحالات الاستخدام الأخرى.
نموذج للتنفيذ في طبقة تجريد الأجهزة (HAL) للكاميرا الخارجية
تم تقديم طبقة تجريد الأجهزة (HAL) للكاميرا الخارجية في Android 9، ويمكن العثور عليها في
شجرة المصدر في
hardware/interfaces/camera/device/3.5/
في Android 10، تم تحديثه لتضمين
ExternalCameraDeviceSession.cpp
،
تنفيذ واجهة برمجة تطبيقات إدارة المخزن المؤقت. طبقة تجريد الأجهزة (HAL) للكاميرا الخارجية هذه
تنفيذ استراتيجية توفير الذاكرة إلى أقصى حد المذكورة في مقالة إدارة الموارد الاحتياطية
الاستراتيجيات في بضع مئات من الأسطر من
لغة البرمجة C++.