BufferQueue و Gralloc

تقوم فئة BufferQueue بربط المكونات التي تولد مخازن مؤقتة للبيانات الرسومية ( المنتجين ) بالمكونات التي تقبل البيانات للعرض أو المعالجة الإضافية ( المستهلكين ). يعتمد كل ما ينقل المخازن المؤقتة للبيانات الرسومية عبر النظام تقريبًا على BufferQueue.

يقوم مُخصص الذاكرة Gralloc بإجراء عمليات تخصيص المخزن المؤقت ويتم تنفيذه من خلال واجهتين HIDL خاصتين بالبائع (انظر hardware/interfaces/graphics/allocator/ hardware/interfaces/graphics/mapper/ ). تأخذ الدالة allocate() الوسائط المتوقعة (العرض والارتفاع وتنسيق البكسل) بالإضافة إلى مجموعة من إشارات الاستخدام.

المنتجون والمستهلكون في BufferQueue

يقوم المستهلكون بإنشاء وامتلاك بنية بيانات BufferQueue ويمكن أن يتواجدوا في عمليات مختلفة عن المنتجين. عندما يحتاج المنتج إلى مخزن مؤقت، فإنه يطلب مخزنًا مؤقتًا مجانيًا من BufferQueue عن طريق استدعاء dequeueBuffer() ، وتحديد عرض المخزن المؤقت وارتفاعه وتنسيق البكسل وعلامات الاستخدام. يقوم المنتج بعد ذلك بملء المخزن المؤقت وإرجاع المخزن المؤقت إلى قائمة الانتظار عن طريق استدعاء queueBuffer() . بعد ذلك، يحصل المستهلك على المخزن المؤقت باستخدام acquireBuffer() ويستفيد من محتويات المخزن المؤقت. عندما ينتهي المستهلك، فإنه يعيد المخزن المؤقت إلى قائمة الانتظار عن طريق استدعاء releaseBuffer() . يتحكم إطار عمل المزامنة في كيفية تحرك المخازن المؤقتة عبر مسار رسومات Android.

يتم تحديد بعض خصائص BufferQueue، مثل الحد الأقصى لعدد المخازن المؤقتة التي يمكنه الاحتفاظ بها، بشكل مشترك من قبل المنتج والمستهلك. ومع ذلك، تقوم BufferQueue بتخصيص المخازن المؤقتة حسب حاجتها إليها. يتم الاحتفاظ بالمخازن المؤقتة ما لم تتغير الخصائص؛ على سبيل المثال، إذا طلب المنتج مخازن مؤقتة ذات حجم مختلف، فسيتم تحرير المخازن المؤقتة القديمة ويتم تخصيص مخازن مؤقتة جديدة عند الطلب.

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

تتبع BufferQueue مع Systrace

لفهم كيفية تحرك المخازن المؤقتة للرسومات، استخدم Systrace ، وهي أداة تسجل نشاط الجهاز خلال فترة زمنية قصيرة. تم تصميم كود الرسومات على مستوى النظام بشكل جيد، كما هو الحال مع الكثير من كود إطار عمل التطبيق ذي الصلة.

لاستخدام Systrace، قم بتمكين العلامات gfx و view و sched . يتم عرض كائنات BufferQueue في التتبع. على سبيل المثال، إذا قمت بتتبع أثناء تشغيل فيديو Grafika's Play (SurfaceView) ، فإن الصف المسمى SurfaceView يخبرك بعدد المخازن المؤقتة التي تم وضعها في قائمة الانتظار في أي وقت محدد.

تزداد القيمة عندما يكون التطبيق نشطًا، مما يؤدي إلى تشغيل عرض الإطارات بواسطة وحدة فك ترميز MediaCodec. تتناقص القيمة أثناء عمل SurfaceFlinger واستهلاك المخازن المؤقتة. عند عرض الفيديو بمعدل 30 إطارًا في الثانية، تختلف قيمة قائمة الانتظار من 0 إلى 1 نظرًا لأن شاشة العرض بمعدل 60 إطارًا في الثانية يمكنها مواكبة المصدر. يتم تنشيط SurfaceFlinger فقط عندما يكون هناك عمل يجب القيام به، وليس 60 مرة في الثانية. يحاول النظام تجنب العمل وتعطيل VSYNC إذا لم يكن هناك شيء يقوم بتحديث الشاشة.

إذا قمت بالتبديل إلى تشغيل فيديو Grafika (TextureView) وحصلت على تتبع جديد، فسترى صفًا يسمى com.android.grafika / com.android.grafika.PlayMovieActivity . هذه هي طبقة واجهة المستخدم الرئيسية، وهي طبقة BufferQueue أخرى. نظرًا لأن TextureView يتم عرضه في طبقة واجهة المستخدم بدلاً من طبقة منفصلة، ​​يتم عرض كافة التحديثات المستندة إلى الفيديو هنا.

جرالوك

يقوم جهاز Gralloc المخصص HAL hardware/libhardware/include/hardware/gralloc.h بإجراء عمليات تخصيص المخزن المؤقت من خلال إشارات الاستخدام. تتضمن علامات الاستخدام سمات مثل:

  • عدد مرات الوصول إلى الذاكرة من البرنامج (CPU)
  • عدد مرات الوصول إلى الذاكرة من الأجهزة (GPU)
  • ما إذا كان سيتم استخدام الذاكرة كنسيج OpenGL ES (GLES).
  • ما إذا كان سيتم استخدام الذاكرة بواسطة برنامج تشفير الفيديو

على سبيل المثال، إذا كان تنسيق المخزن المؤقت الخاص بالمنتج يحدد RGBA_8888 بكسل، وأشار المنتج إلى أنه سيتم الوصول إلى المخزن المؤقت من البرنامج (بمعنى أن التطبيق سيلمس وحدات البكسل الموجودة على وحدة المعالجة المركزية)، يقوم Gralloc بإنشاء مخزن مؤقت بـ 4 بايت لكل بكسل بترتيب RGBA. إذا حدد المنتج بدلاً من ذلك أنه سيتم الوصول إلى المخزن المؤقت الخاص به فقط من الأجهزة وكنسيج GLES، فيمكن لـ Gralloc القيام بأي شيء يريده برنامج تشغيل GLES، مثل طلب BGRA والتخطيطات غير الخطية وتنسيقات الألوان البديلة. إن السماح للأجهزة باستخدام تنسيقها المفضل يمكن أن يؤدي إلى تحسين الأداء.

لا يمكن دمج بعض القيم على منصات معينة. على سبيل المثال، قد تتطلب علامة برنامج تشفير الفيديو وحدات بكسل YUV، لذا تفشل إضافة الوصول إلى البرنامج وتحديد RGBA_8888 .

يمكن تمرير المقبض الذي تم إرجاعه بواسطة Gralloc بين العمليات من خلال Binder.

المخازن المؤقتة المحمية

تسمح علامة استخدام Gralloc GRALLOC_USAGE_PROTECTED بعرض المخزن المؤقت للرسومات فقط من خلال مسار محمي بالأجهزة. تعتبر مستويات التراكب هذه هي الطريقة الوحيدة لعرض محتوى DRM (لا يمكن الوصول إلى المخازن المؤقتة المحمية بموجب DRM بواسطة SurfaceFlinger أو برنامج تشغيل OpenGL ES).

لا يمكن عرض الفيديو المحمي بموجب إدارة الحقوق الرقمية (DRM) إلا على مستوى التراكب. يجب تنفيذ مشغلات الفيديو التي تدعم المحتوى المحمي باستخدام SurfaceView. لا يمكن للبرامج التي تعمل على أجهزة غير محمية قراءة المخزن المؤقت أو كتابته؛ يجب أن تظهر المسارات المحمية بالأجهزة على تراكب Hardware Composer (أي أن مقاطع الفيديو المحمية تختفي من الشاشة إذا قام Hardware Composer بالتبديل إلى تكوين OpenGL ES).

للحصول على تفاصيل حول المحتوى المحمي، راجع إدارة الحقوق الرقمية (DRM) .