بنية الرسومات

معلومات يجب أن يعرفها كل مطوّر عن المنصات وSurfaceHolder وEGLSurface وSurfaceView وGLSurfaceView وSurfaceTexture وTextureView وSurfaceFlinger وVulkan

توضّح هذه الصفحة العناصر الأساسية لبنية الرسومات على مستوى نظام Android وكيفية استخدامها من خلال إطار عمل التطبيق ونظام الوسائط المتعددة. ينصب التركيز على كيفية انتقال مخازن البيانات الرسومية المؤقتة عبر النظام. إذا تساءلت يومًا عن سبب سلوك SurfaceView وTextureView على النحو الذي تتصرفان به، أو عن كيفية تفاعل الأسطح وEGLSurface، فأنت في المكان الصحيح.

يُفترض أن تكون على دراية ببعض أساسيات أجهزة Android وتطوير التطبيقات. لا تحتاج إلى معرفة تفصيلية بإطار عمل التطبيق، ولا يتم ذكر سوى عدد قليل جدًا من طلبات البيانات من واجهة برمجة التطبيقات، ولكن لا تتداخل المواد مع المستندات الأخرى المتاحة للجميع. الهدف هو تقديم تفاصيل حول الأحداث المهمة المتعلّقة بعرض إطار لإخراج البيانات لمساعدتك في اتخاذ خيارات مدروسة عند تصميم تطبيق. ولتحقيق ذلك، يتناول هذا المستند الموضوع من الأسفل إلى الأعلى، ويصف طريقة عمل فئات واجهة المستخدم بدلاً من طريقة استخدامها.

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

المكوّنات المنخفضة المستوى

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

المكوّنات ذات المستوى العالي

  • SurfaceView وGLSurfaceView تجمع SurfaceView بين مساحة عرض وعرض. يتم دمج مكوّنات العرض الخاصة بـ SurfaceView من خلال SurfaceFlinger (وليس التطبيق)، ما يتيح العرض من سلسلة محادثات/عملية منفصلة وعزلها عن عرض واجهة مستخدم التطبيق. توفّر GLSurfaceView فئات مساعدة لإدارة سياقات EGL والتواصل بين سلاسل التنفيذ والتفاعل مع مراحل نشاط التطبيق (ولكن ليس من الضروري استخدام GLES).
  • SurfaceTexture تجمع SurfaceTexture بين مساحة عرض ونسيج GLES لإنشاء BufferQueue يكون تطبيقك هو المستهلك له. عندما يضع المنتج مخزنًا مؤقتًا جديدًا في قائمة الانتظار، يتم إشعار تطبيقك، الذي بدوره يحرر المخزن المؤقت الذي تم الاحتفاظ به سابقًا، ويحصل على المخزن المؤقت الجديد من قائمة الانتظار، ويجري عمليات استدعاء EGL لإتاحة المخزن المؤقت لـ GLES كمادة عرض خارجية. أتاح الإصدار 7.0 من نظام التشغيل Android إمكانية تشغيل فيديوهات محمية باستخدام نسيج آمن، ما يتيح لوحدة معالجة الرسومات إجراء معالجة لاحقة لمحتوى الفيديو المحمي.
  • TextureView تجمع TextureView بين طريقة العرض وSurfaceTexture. يغلّف TextureView عنصر SurfaceTexture ويتولّى مسؤولية الاستجابة لعمليات معاودة الاتصال والحصول على مخازن مؤقتة جديدة. عند الرسم، تستخدم TextureView محتوى المخزن المؤقت الذي تم تلقّيه مؤخرًا كمصدر بيانات، ويتم العرض في أي مكان وبأي طريقة يشير إليها حالة العرض. يتم عرض المقطوعة الموسيقية دائمًا باستخدام GLES، ما يعني أنّ التعديلات على المحتوى قد تؤدي إلى إعادة رسم عناصر العرض الأخرى أيضًا.