تربط فئة BufferQueue المكونات التي تنشئ مخازن مؤقتة للبيانات الرسومية ( المنتجون ) بالمكونات التي تقبل البيانات للعرض أو المعالجة الإضافية ( المستهلكين ). يعتمد كل شيء تقريبًا ينقل المخازن المؤقتة للبيانات الرسومية عبر النظام على BufferQueue.
ينفذ مخصص ذاكرة Gralloc عمليات تخصيص المخزن المؤقت ويتم تنفيذه من خلال واجهتين HIDL خاصتين بالبائع (انظر hardware/interfaces/graphics/allocator/
hardware/interfaces/graphics/mapper/
). تأخذ وظيفة allocate()
الوسيطات المتوقعة (العرض ، الارتفاع ، تنسيق البكسل) بالإضافة إلى مجموعة من إشارات الاستخدام.
المنتجين والمستهلكين BufferQueue
ينشئ المستهلكون ويمتلكون بنية بيانات BufferQueue ويمكن أن يتواجدوا في عمليات مختلفة عن المنتجين. عندما يحتاج المنتج إلى مخزن مؤقت ، فإنه يطلب مخزنًا مؤقتًا مجانيًا من BufferQueue عن طريق استدعاء dequeueBuffer()
، وتحديد عرض المخازن المؤقتة وارتفاعها وتنسيق البكسل وعلامات الاستخدام. يقوم المنتج بعد ذلك بملء المخزن المؤقت وإرجاع المخزن المؤقت إلى قائمة الانتظار عن طريق استدعاء queueBuffer()
. بعد ذلك ، يكتسب المستهلك المخزن المؤقت باستخدام acquireBuffer()
ويستخدم محتويات المخزن المؤقت. عندما ينتهي المستهلك ، يقوم بإرجاع المخزن المؤقت إلى قائمة الانتظار عن طريق استدعاء releaseBuffer()
. يتحكم إطار عمل المزامنة في كيفية تحرك المخازن المؤقتة عبر مسار رسومات Android.
يتم تحديد بعض خصائص BufferQueue ، مثل الحد الأقصى لعدد المخازن المؤقتة التي يمكنها الاحتفاظ بها ، بشكل مشترك من قبل المنتج والمستهلك. ومع ذلك ، فإن BufferQueue يخصص المخازن المؤقتة التي تحتاجها. يتم الاحتفاظ بالمخازن المؤقتة ما لم تتغير الخصائص ؛ على سبيل المثال ، إذا طلب أحد المنتجين مخازن مؤقتة بحجم مختلف ، يتم تحرير المخازن المؤقتة القديمة ويتم تخصيص مخازن مؤقتة جديدة عند الطلب.
لا يتم نسخ محتويات المخزن المؤقت أبدًا بواسطة BufferQueue ، نظرًا لأن نقل هذا القدر من البيانات غير فعال. بدلاً من ذلك ، يتم دائمًا تمرير المخازن المؤقتة بواسطة مقبض.
تتبع المخزن المؤقت
لفهم كيفية تحرك المخازن المؤقتة للرسومات ، استخدم Systrace ، وهي أداة تسجل نشاط الجهاز خلال فترة زمنية قصيرة. إن رمز الرسومات على مستوى النظام مُجهز جيدًا ، مثل الكثير من كود إطار عمل التطبيق ذي الصلة.
لاستخدام view
، قم بتمكين علامات gfx
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
بإجراء عمليات تخصيص المخزن المؤقت من خلال إشارات الاستخدام. تتضمن إشارات الاستخدام سمات مثل:
- كم مرة سيتم الوصول إلى الذاكرة من البرنامج (وحدة المعالجة المركزية)
- كم مرة سيتم الوصول إلى الذاكرة من الأجهزة (GPU)
- ما إذا كان سيتم استخدام الذاكرة كنسيج OpenGL ES (GLES) أم لا
- ما إذا كان سيتم استخدام الذاكرة بواسطة برنامج تشفير الفيديو
على سبيل المثال ، إذا كان تنسيق المخزن المؤقت للمنتج يحدد RGBA_8888
بكسل ، ويشير المنتج إلى أنه سيتم الوصول إلى المخزن المؤقت من البرنامج (بمعنى أن التطبيق سوف يلمس وحدات البكسل على وحدة المعالجة المركزية) ، فإن Gralloc ينشئ مخزنًا مؤقتًا بـ 4 بايت لكل بكسل بترتيب RGBA. بدلاً من ذلك ، إذا حدد المنتج أنه سيتم الوصول إلى المخزن المؤقت الخاص به فقط من الأجهزة وكمادة GLES ، يمكن لـ Gralloc فعل أي شيء يريده سائق GLES ، مثل طلب BGRA ، والتخطيطات غير الخطية ، وتنسيقات الألوان البديلة. يمكن أن يؤدي السماح للجهاز باستخدام تنسيقه المفضل إلى تحسين الأداء.
لا يمكن دمج بعض القيم في أنظمة أساسية معينة. على سبيل المثال ، قد تتطلب علامة تشفير الفيديو وحدات بكسل YUV ، لذلك تفشل إضافة الوصول إلى البرامج وتحديد RGBA_8888
.
يمكن تمرير المقبض الذي تم إرجاعه بواسطة Gralloc بين العمليات من خلال Binder.
المخازن المؤقتة المحمية
تسمح علامة استخدام GRALLOC_USAGE_PROTECTED
بعرض المخزن المؤقت للرسومات فقط من خلال مسار محمي بالأجهزة. تعد طائرات التراكب هذه هي الطريقة الوحيدة لعرض محتوى DRM (لا يمكن الوصول إلى المخازن المؤقتة المحمية بواسطة DRM بواسطة SurfaceFlinger أو برنامج تشغيل OpenGL ES).
يمكن تقديم الفيديو المحمي بنظام DRM فقط على مستوى تراكب. يجب تنفيذ مشغلات الفيديو التي تدعم المحتوى المحمي باستخدام SurfaceView. لا يمكن للبرامج التي تعمل على أجهزة غير محمية قراءة أو كتابة المخزن المؤقت ؛ يجب أن تظهر المسارات المحمية بالأجهزة على تراكب مؤلف الأجهزة (أي تختفي مقاطع الفيديو المحمية من الشاشة إذا قام مؤلف الأجهزة بالتبديل إلى تكوين OpenGL ES).
للحصول على تفاصيل حول المحتوى المحمي ، راجع DRM .