ما يجب أن يعرفه كل مطور عن الأسطح وSurfaceHolder وEGLSurface وSurfaceView وGLSurfaceView وSurfaceTexture وTextureView وSurfaceFlinger وVulkan.
تصف هذه الصفحة العناصر الأساسية للبنية الرسومية على مستوى نظام Android وكيفية استخدامها بواسطة إطار عمل التطبيق ونظام الوسائط المتعددة. ينصب التركيز على كيفية تحرك المخازن المؤقتة للبيانات الرسومية عبر النظام. إذا سبق لك أن تساءلت عن سبب تصرف SurfaceView وTextureView بالطريقة التي يتصرفان بها، أو كيفية تفاعل الأسطح وEGLSurface، فأنت في المكان الصحيح.
يُفترض وجود بعض الإلمام بأجهزة Android وتطوير التطبيقات. لا تحتاج إلى معرفة تفصيلية بإطار عمل التطبيق وتم ذكر عدد قليل جدًا من استدعاءات واجهة برمجة التطبيقات (API)، لكن المادة لا تتداخل مع الوثائق العامة الأخرى. الهدف هو تقديم تفاصيل حول الأحداث المهمة التي ينطوي عليها عرض إطار للمخرجات لمساعدتك في اتخاذ خيارات مستنيرة عند تصميم التطبيق. ولتحقيق ذلك، فإننا نعمل من الأسفل إلى الأعلى، ونصف كيفية عمل فئات واجهة المستخدم بدلاً من كيفية استخدامها.
يتضمن هذا القسم عدة صفحات تغطي كل شيء بدءًا من المواد الأساسية وحتى تفاصيل HAL وحالات الاستخدام. يبدأ بشرح المخازن المؤقتة لرسومات Android، ويصف التركيب وآلية العرض، ثم ينتقل إلى الآليات ذات المستوى الأعلى التي تزود المُركب بالبيانات. نوصي بقراءة الصفحات بالترتيب المذكور أدناه بدلاً من الانتقال إلى موضوع يبدو مثيرًا للاهتمام.
مكونات منخفضة المستوى
- BufferQueue و gralloc . يربط BufferQueue شيئًا يُنشئ مخازن مؤقتة للبيانات الرسومية ( المنتج ) بشيء يقبل البيانات للعرض أو المعالجة الإضافية ( المستهلك ). يتم إجراء عمليات تخصيص المخزن المؤقت من خلال مُخصص ذاكرة gralloc الذي يتم تنفيذه من خلال واجهة HAL الخاصة بالبائع.
- SurfaceFlinger وHardware Composer والشاشات الافتراضية . يقبل SurfaceFlinger المخازن المؤقتة للبيانات من مصادر متعددة، ويقوم بتركيبها وإرسالها إلى الشاشة. يحدد HWC لمؤلف الأجهزة الطريقة الأكثر فعالية لتركيب المخازن المؤقتة مع الأجهزة المتاحة، كما توفر شاشات العرض الافتراضية الإخراج المركب داخل النظام (تسجيل الشاشة أو إرسال الشاشة عبر الشبكة).
- السطح والقماش وSurfaceHolder . يُنتج السطح قائمة انتظار مؤقتة يتم استهلاكها غالبًا بواسطة SurfaceFlinger. عند العرض على السطح، تنتهي النتيجة في مخزن مؤقت يتم شحنه إلى المستهلك. توفر واجهات برمجة تطبيقات Canvas تطبيقًا برمجيًا (مع دعم تسريع الأجهزة) للرسم مباشرة على السطح (بديل منخفض المستوى لبرنامج OpenGL ES). أي شيء يتعلق بالعرض يتضمن SurfaceHolder، الذي تتيح واجهات برمجة التطبيقات الخاصة به الحصول على معلمات السطح وتعيينها مثل الحجم والتنسيق.
- EGLSurface و OpenGL ES . يحدد OpenGL ES (GLES) واجهة برمجة التطبيقات لعرض الرسومات المصممة ليتم دمجها مع EGL ، وهي مكتبة يمكنها إنشاء النوافذ والوصول إليها من خلال نظام التشغيل (لرسم مضلعات مزخرفة، استخدم استدعاءات GLES؛ ولعرض العرض على الشاشة، استخدم استدعاءات EGL) ). تغطي هذه الصفحة أيضًا ANativeWindow، المكافئ C/C++ لفئة Java Surface المستخدمة لإنشاء سطح نافذة EGL من التعليمات البرمجية الأصلية.
- فولكان . Vulkan عبارة عن واجهة برمجة تطبيقات منخفضة التكلفة ومتعددة المنصات للرسومات ثلاثية الأبعاد عالية الأداء. مثل OpenGL ES، يوفر Vulkan أدوات لإنشاء رسومات عالية الجودة في الوقت الفعلي في التطبيقات. تتضمن مزايا Vulkan تخفيضات في حمل وحدة المعالجة المركزية ودعم لغة SPIR-V Binary Intermediate .
مكونات رفيعة المستوى
- SurfaceView وGLSurfaceView . يجمع SurfaceView بين السطح والعرض. يتم تركيب مكونات عرض SurfaceView بواسطة SurfaceFlinger (وليس التطبيق)، مما يتيح العرض من سلسلة/عملية منفصلة والعزل عن عرض واجهة مستخدم التطبيق. يوفر GLSurfaceView فئات مساعدة لإدارة سياقات EGL، والتواصل بين الخيوط، والتفاعل مع دورة حياة النشاط (ولكن ليس مطلوبًا لاستخدام GLES).
- نسيج السطح . يجمع SurfaceTexture بين السطح وملمس GLES لإنشاء BufferQueue الذي يكون تطبيقك هو المستهلك له. عندما يقوم منتج بوضع مخزن مؤقت جديد في قائمة الانتظار، فإنه يقوم بإعلام التطبيق الخاص بك، والذي بدوره يقوم بتحرير المخزن المؤقت المحتفظ به مسبقًا، ويكتسب المخزن المؤقت الجديد من قائمة الانتظار، ويقوم باستدعاءات EGL لجعل المخزن المؤقت متاحًا لـ GLES كنسيج خارجي. أضاف Android 7.0 دعمًا لتشغيل الفيديو الآمن مما يتيح المعالجة اللاحقة لوحدة معالجة الرسومات لمحتوى الفيديو المحمي.
- عرض الملمس . يجمع TextureView بين طريقة العرض وSurfaceTexture. يقوم TextureView بتغليف SurfaceTexture ويتحمل مسؤولية الاستجابة لعمليات الاسترجاعات والحصول على مخازن مؤقتة جديدة. عند الرسم، يستخدم TextureView محتويات المخزن المؤقت الذي تم استلامه مؤخرًا كمصدر بياناته، حيث يتم عرضه أينما وكيفما تشير حالة العرض إلى ذلك. يتم تنفيذ تكوين العرض دائمًا باستخدام GLES، مما يعني أن تحديثات المحتويات قد تتسبب في إعادة رسم عناصر العرض الأخرى أيضًا.