
يوفّر إطار عمل Android مجموعة متنوعة من واجهات برمجة التطبيقات لعرض الرسومات ثنائية وثلاثية الأبعاد التي تتفاعل مع عمليات تنفيذ مصنعي برامج تشغيل الرسومات، لذا من المهم أن يكون لديك فهم جيد لكيفية عمل واجهات برمجة التطبيقات هذه على مستوى أعلى. تعرِض هذه الصفحة طبقة تجريد أجهزة الرسومات (HAL) التي تم إنشاء برامج التشغيل هذه استنادًا إليها. قبل المتابعة في هذا القسم، يُرجى الاطّلاع على المصطلحات التالية:
Canvas
(عنصر واجهة برمجة التطبيقات)Surface
. تحتوي فئة Canvas
على methods لرسم الكمبيوتر العادي للصور المخصّصة للشاشة والخطوط والدائرات والمستطيلات والنصوص وما إلى ذلك، وهي مرتبطة بصور مخصّصة للشاشة أو سطح. اللوحة هي الطريقة الأسهل والأبسط لرسم الأجسام ثنائية الأبعاد
على الشاشة. الصف الأساسي هو
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
(عنصر واجهة برمجة التطبيقات)android.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 و"أداة إنشاء الصور" (HWC) لإنشاء مجموعة من مساحات العرض.
يمكن أن تستهلك تطبيقات OpenGL ES الأخرى أحداث تدفق الصور أيضًا، مثل تطبيق الكاميرا الذي يستهلك حدث تدفق صورة معاينة الكاميرا. يمكن أن تكون التطبيقات غير المستندة إلى رسومات OpenGL مستهلكين أيضًا، مثل فئة ImageReader.
مؤلف الأجهزة
واجهة تجريد الأجهزة للنظام الفرعي للعرض يمكن لـ SurfaceFlinger تفويض بعض مهام التصميم إلى HWC لتخفيف الضغط عن OpenGL ووحدة معالجة الرسومات. يعمل SurfaceFlinger كعميل آخر لواجهة برمجة التطبيقات OpenGL ES. لذلك، عندما يُدمج SurfaceFlinger بشكل نشط بين عنصر تخزين مؤقت أو اثنين في عنصر تخزين مؤقت ثالث، مثلاً، يستخدم OpenGL ES. وهذا يجعل عملية الدمج تستهلك طاقة أقل من توجيه كل العمليات الحسابية إلى وحدة معالجة الرسومات.
يُجري المعيار Hardware Composer HAL النصف الآخر من العمل، وهو النقطة المركزية لجميع عمليات عرض الرسومات على Android. يجب أن تتيح وحدة التحكّم في الأجهزة (HWC) الأحداث، وأحدها هو VSync (الآخر هو hotplug لتوفير إمكانية التوصيل والتشغيل مع تقنية HDMI).
Gralloc
يجب توفُّر أداة تخصيص ذاكرة الرسومات (Gralloc) لتخصيص الذاكرة التي يطلبها صنّاع الصور. لمعرفة التفاصيل، يُرجى الاطّلاع على BufferQueue وGralloc.
تدفق البيانات
يوضّح المخطّط التالي مسار معالجة الرسومات في Android:
الشكل 2: يتم نقل بيانات الرسومات من خلال Android.
الأجسام على يمين الشاشة هي أدوات عرض تُنشئ ذاكرة تخزين مؤقت للرسومات، مثل الشاشة الرئيسية وشريط الحالة وواجهة مستخدم النظام. SurfaceFlinger هو أداة الدمج وHWC هو أداة الإنشاء.
BufferQueue
توفّر BufferQueues الرابط بين مكوّنات الرسومات في Android. هذه هي زوج من الطوابير التي تتوسّط دورة الفواصل الزمنية المستمرة من العميل إلى المستهلِك. بعد أن يرسل المنتجون ذاكرة التخزين المؤقت، يتحمّل SurfaceFlinger مسؤولية تجميع كل المحتوى على الشاشة.
يوضّح الرسم البياني التالي عملية التواصل في BufferQueue:
الشكل 3: عملية التواصل في BufferQueue
يحتوي BufferQueue على المنطق الذي يربط بين منتجي بث الصور ومستهلكيه. تشمل بعض الأمثلة على مُنشئي الصور معاينات الكاميرا التي تُنشئها واجهة HAL للكاميرا أو ألعاب OpenGL ES. تشمل بعض الأمثلة على مستخدِمي الصور SurfaceFlinger أو تطبيقًا آخر يعرض بثًا على OpenGL ES، مثل تطبيق الكاميرا الذي يعرض عدسة الكاميرا.
BufferQueue هي بنية بيانات تجمع بين مجموعة مصفوفات تخزين مؤقت وسلسلة انتظار، ويستخدم
Binder IPC لتمرير مصفوفات التخزين المؤقت بين العمليات. واجهة المنتج، أو
ما يتم تمريره إلى مستخدم يريد إنشاء مخازن مؤقتة للرسومات، هي
IGraphicBufferProducer
(جزء من SurfaceTexture
).
غالبًا ما يتم استخدام BufferQueue لعرض المحتوى على سطح معيّن واستهلاكه باستخدام GL
Consumer، بالإضافة إلى مهام أخرى.
يمكن أن تعمل BufferQueue بثلاثة أوضاع مختلفة:
لتنفيذ معظم هذه المهام، يعمل SurfaceFlinger كعميل OpenGL ES آخر. لذلك، عندما يُنشئ SurfaceFlinger تركيبًا نشطًا من مخزن مؤقت واحد أو مخزنَين مؤقتَين في مخزن مؤقت ثالث، على سبيل المثال، يستخدم OpenGL ES.
يُجري "مُنشئ الأجهزة" HAL النصف الآخر من العمل. ويعمل HAL هذا بدوره كنقطة مركزية لجميع عمليات عرض الرسومات على Android.