
يوفّر إطار عمل Android مجموعة متنوعة من واجهات برمجة التطبيقات لعرض الرسومات ثنائية الأبعاد و ثلاثية الأبعاد التي تتفاعل مع عمليات تنفيذ مصنعي برامج تشغيل الرسومات، لذا من المهم أن يكون لديك فهم جيد لكيفية عمل واجهات برمجة التطبيقات هذه على مستوى أعلى. تعرِض هذه الصفحة طبقة تجريد أجهزة الرسومات (HAL) التي تم إنشاء برامج التشغيل هذه استنادًا إليها. قبل المتابعة في هذا القسم، يُرجى الاطّلاع على المصطلحات التالية:
Canvas
(عنصر واجهة برمجة التطبيقات)Surface
. يحتوي Canvas
على طُرق
لرسم الكمبيوتر العادي للصور المخصّصة للشاشة والخطوط والدائرات والمستطيلات والنصوص وما إلى ذلك، وهو مرتبط
بصورة مخصّصة للشاشة أو سطح. اللوحة هي الطريقة الأسهل والأبسط لرسم الأجسام ثنائية الأبعاد
على الشاشة. الصف الأساسي هو
Canvas
.
android.graphics.drawable
.
لمزيد من المعلومات عن العناصر القابلة للرسم والموارد الأخرى، يُرجى الاطّلاع على
الموارد.
android.opengl
وjavax.microedition.khronos.opengles
وظائف OpenGL ES.Surface
(عنصر واجهة برمجة التطبيقات)Surface
. استخدِم فئة
SurfaceView
بدلاً من فئة
Surface
مباشرةً.
SurfaceView
(عنصر واجهة برمجة التطبيقات)View
يلف Surface
لرسمه، ويعرِض طُرقًا لتحديد حجمه وتنسيقه بشكل ديناميكي. توفّر طريقة العرض على سطح الشاشة طريقة للرسم بشكل مستقل عن سلسلة مهام واجهة المستخدم
للعمليات التي تستهلك موارد كثيرة، مثل الألعاب أو معاينات الكاميرا، ولكنّها تستخدِم ذاكرة إضافية
نتيجةً لذلك. تتوافق "عرض السطح" مع كل من الرسم على سطح اللوحة ورسومات OpenGL ES. الفئة الأساسية لكائن SurfaceView
هي
SurfaceView
.
R.style
والمسبوقة بالرمز Theme_
.View
(عنصر واجهة برمجة التطبيقات)View
هي الفئة الأساسية
لمعظم مكوّنات التنسيق في النشاط أو شاشة الحوار، مثل مربّعات النص
والنوافذ. يتلقّى عنصر View
طلبات من العنصر الرئيسي (راجِع
ViewGroup
) لرسم نفسه، ويُعلم العنصر الرئيسي
بالحجم والموقع المفضّلَين، وقد لا يراعي العنصر
الرئيسي ذلك. لمزيد من المعلومات، يُرجى الاطّلاع على
View
.
ViewGroup
(عنصر واجهة برمجة التطبيقات)widget
ولكنها تمدّد فئة
ViewGroup
.
android.widget
. Window
(عنصر واجهة برمجة التطبيقات)Window
التي تحدّد عناصر النافذة
العامة، مثل المظهر والأسلوب ونص شريط العناوين وموقع القوائم ومضمونها. تستخدِم المحادثات والأنشطة عملية تنفيذ لفئة
Window
لعرض كائن Window
. لست بحاجة إلى تنفيذ
فئة Window
أو استخدام النوافذ في تطبيقك.يرسم مطوّرو التطبيقات الصور على الشاشة بثلاث طرق: باستخدام Canvas أو OpenGL ES أو Vulkan.
مكوّنات الرسومات في Android
بغض النظر عن واجهة برمجة التطبيقات التي يستخدمها المطوّرون لعرض المحتوى، يتم عرض كل المحتوى على سطح. يمثّل السطح جانب المنتج في ملف محتوى في ذاكرة التخزين المؤقت الذي يستخدِمه SurfaceFlinger غالبًا. كل نافذة يتم إنشاؤها على نظام التشغيل Android تكون مستندة إلى سطح. تُدمج مكتبة SurfaceFlinger جميع مساحات العرض المرئية المعروضة على الشاشة.
يوضّح الرسم البياني التالي كيفية عمل المكونات الرئيسية معًا:

الشكل 1: كيفية عرض مساحات العرض
في ما يلي وصف المكونات الرئيسية:
منتجو أحداث "بث الصور"
يمكن أن يكون منتج بث الصور أيّ جهاز ينشئ ذاكرة تخزين مؤقتة للرسومات بهدف استهلاكها. وتشمل الأمثلة OpenGL ES وCanvas 2D وبرامج فك ترميز الفيديو في خادم الوسائط.
مستخدِمو بثّ الصور
إنّ المستخدِم الأكثر شيوعًا لملفات بثّ الصور هو SurfaceFlinger، وهو خدمة النظام التي تستخدِم الأسطح المرئية حاليًا وتُدمجها على الشاشة باستخدام المعلومات التي يوفّرها "مدير النوافذ". SurfaceFlinger هي الخدمة الوحيدة التي يمكنها تعديل محتوى الشاشة. يستخدم SurfaceFlinger OpenGL و"أداة إنشاء الأجهزة" لإنشاء مجموعة من مساحات العرض.
يمكن لتطبيقات OpenGL ES الأخرى أيضًا استخدام أحداث بث الصور، مثل تطبيق الكاميرا الذي يستخدم حدث بث صورة معاينة الكاميرا. يمكن أن تكون التطبيقات غير المستندة إلى رسومات OpenGL مستهلكين أيضًا، مثل فئة ImageReader.
مؤلف الأجهزة
تجريد الأجهزة للنظام الفرعي للعرض يمكن لـ SurfaceFlinger تفويض بعض مهام التصميم إلى "أداة إنشاء الرسومات بالأجهزة" لتخفيف الحمل عن OpenGL ووحدة معالجة الرسومات. يعمل SurfaceFlinger كعميل آخر لواجهة برمجة التطبيقات OpenGL ES. لذلك، عندما يُركّب SurfaceFlinger بشكل نشط ذاكرة تخزين مؤقت واحدة أو اثنتين في ذاكرة تخزين مؤقت ثالث، على سبيل المثال، يستخدم OpenGL ES. وهذا يجعل عملية الدمج تستهلك طاقة أقل من توجيه كل العمليات الحسابية إلى وحدة معالجة الرسومات.
يُجري HAL لتنسيق compositing للأجهزة النصف الآخر من العمل، وهو النقطة المركزية لجميع عمليات عرض الرسومات على Android. يجب أن يتيح "أداة إنشاء الأجهزة" الأحداث، وأحدها هو VSYNC (الآخر هو hotplug لإتاحة استخدام ميزة "التوصيل والتشغيل" مع منفذ HDMI).
Gralloc
يجب توفُّر أداة تخصيص ذاكرة الرسومات (Gralloc) لتخصيص الذاكرة التي يطلبها صنّاع الصور. لمعرفة التفاصيل، يُرجى الاطّلاع على Gralloc HAL.
تدفق البيانات
اطّلِع على الرسم البياني التالي للاطّلاع على مسار معالجة الرسومات في Android:

الشكل 2: تدفق بيانات الرسومات من خلال Android
الأجسام على يمين الشاشة هي أدوات عرض تُنشئ ذاكرة تخزين مؤقت للرسومات، مثل الشاشة الرئيسية وشريط الحالة وواجهة مستخدم النظام. SurfaceFlinger هو أداة الدمج وHardware Composer هو أداة الإنشاء.
BufferQueue
توفّر BufferQueues الرابط بين مكوّنات الرسومات في Android. هذه هي قائمة انتظار تتوسّط دورة الفواصل الزمنية المستمرة من العميل إلى المستهلِك. بعد أن يُرسِل المُنشِئون ذاكرات التخزين المؤقت، يتحمّل SurfaceFlinger مسؤولية دمج كل العناصر على الشاشة.
اطّلِع على الرسم البياني التالي لعملية التواصل مع BufferQueue.

الشكل 3: عملية تواصل BufferQueue
يحتوي BufferQueue على المنطق الذي يربط بين منتجي بث الصور ومستهلكيه. تشمل بعض الأمثلة على تطبيقات إنشاء الصور معاينات الكاميرا التي تنتجها واجهة HAL للكاميرا أو ألعاب OpenGL ES. تشمل بعض الأمثلة على مستخدِمي الصور SurfaceFlinger أو تطبيقًا آخر يعرض بثًا على OpenGL ES، مثل تطبيق الكاميرا الذي يعرض عدسة الكاميرا.
BufferQueue هي بنية بيانات تجمع بين مجموعة من المخازن المؤقتة مع قائمة انتظار، و تستخدم Binder IPC لتمرير المخازن المؤقتة بين العمليات. واجهة المنتج، أو ما يتم تمريره إلى مستخدم يريد إنشاء مخازن مؤقتة للرسومات، هي IGraphicBufferProducer (جزء من SurfaceTexture). غالبًا ما يتم استخدام BufferQueue لعرض المحتوى على سطح معيّن واستهلاكه باستخدام GL Consumer، بالإضافة إلى مهام أخرى.
يمكن أن تعمل BufferQueue بثلاثة أوضاع مختلفة:
الوضع المشابه للوضع المتزامن: تعمل BufferQueue تلقائيًا في وضع مشابه للوضع المتزامن، حيث يتم إرسال كل ذاكرة تخزين مؤقتة واردة من المُنشئ إلى المستهلِك. لا يتم أبدًا تجاهل أي ذاكرة تخزين مؤقت في هذا الوضع. وإذا كان المُنشئ سريعًا جدًا وينشئ ذاكرة تخزين مؤقت أسرع من استهلاكها، سيتم حظر المحتوى والانتظار إلى أن تصبح ذاكرة التخزين المؤقت متاحة.
الوضع غير المحظور: يمكن أن تعمل BufferQueue أيضًا في وضع غير محظور حيث تُنشئ خطأ بدلاً من انتظار ملف تخزين مؤقت في تلك الحالات. ولا يتم أيضًا تجاهل أي ذاكرة تخزين مؤقت في هذا الوضع. ويُعدّ ذلك مفيدًا لتجنُّب حالات التوقف المفاجئ المحتمَلة في برامج التطبيقات التي قد لا تفهم التبعيات المعقّدة لإطار عمل الرسومات.
وضع الحذف: أخيرًا، يمكن ضبط BufferQueue لحذف المخازن المؤقتة القديمة بدلاً من إنشاء أخطاء أو الانتظار. على سبيل المثال، في حال إجراء عملية GL العرض في عرض نسيج والرسم في أسرع وقت ممكن، يجب إسقاط المخزن المؤقت.
لتنفيذ معظم هذه المهام، يعمل SurfaceFlinger كعميل OpenGL ES آخر. لذلك، عندما يُركّب SurfaceFlinger بشكل نشط ذاكرة تخزين مؤقت واحدة أو اثنتين في ذاكرة تخزين مؤقت ثالثة، على سبيل المثال، يستخدم OpenGL ES.
يُجري "مُنشئ الأجهزة" HAL النصف الآخر من العمل. ويعمل HAL هذا بدوره كنقطة مركزية لجميع عمليات عرض الرسومات على Android.