الرسومات

رمز Android Graphics HAL

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

canvas (مصطلح عام)، Canvas (عنصر واجهة برمجة التطبيقات)
اللوحة هي سطح رسم يعالج تركيب الأجزاء الفعلية على سطح صورة نقطية أو كائن Surface. يحتوي Canvas على طُرق لرسم الكمبيوتر العادي للصور المخصّصة للشاشة والخطوط والدائرات والمستطيلات والنصوص وما إلى ذلك، وهو مرتبط بصورة مخصّصة للشاشة أو سطح. اللوحة هي الطريقة الأسهل والأبسط لرسم الأجسام ثنائية الأبعاد على الشاشة. الصف الأساسي هو Canvas.
drawable
العنصر القابل للرسم هو مورد مرئي مجمّع يمكن استخدامه كخلفية أو عنوان أو جزء آخر من الشاشة. يتم عادةً تحميل عنصر قابل للرسم في عنصر واجهة مستخدم آخر، مثل صورة خلفية. لا يمكن للعنصر القابل للرسم تلقّي الأحداث، ولكنه يحدّد سمات أخرى مختلفة، مثل الحالة والجدولة، لتفعيل الفئات الفرعية، مثل عناصر الصور المتحركة أو مكتبات الصور. يتم تحميل العديد من العناصر القابلة للرسم من ملفات الموارد القابلة للرسم - ملفات XML أو ملفات صور نقطية تصف الصورة. يتم تجميع موارد Drawable في فئات فرعية من android.graphics.drawable. لمزيد من المعلومات عن العناصر القابلة للرسم والموارد الأخرى، يُرجى الاطّلاع على الموارد.
مورد التصميم
مورد التنسيق هو ملف XML يصف تنسيق شاشة النشاط. لمزيد من المعلومات، يُرجى الاطّلاع على مورد التنسيق.
nine-patch (9-patch, NinePatch)
الصورة المربّعة التسعة هي مورد رسومات نقطية قابل للتغيير يمكن استخدامه للخلفيات أو الصور الأخرى على الجهاز. لمزيد من المعلومات، يُرجى الاطّلاع على الصورة التي تتكوّن من تسعة مربّعات.
OpenGL ES
OpenGL ES هي واجهة برمجة تطبيقات متوافقة مع جميع الأنظمة الأساسية لعرض الرسومات ثنائية وثلاثية الأبعاد. يوفّر Android مكتبات OpenGL ES لعرض الصور الثلاثية الأبعاد باستخدام تكنولوجيا تسريع الأجهزة. بالنسبة إلى معالجة المجسمات المسطحة، فإنّ اللوحة هي الخيار الأسهل. تتوفّر مكتبة OpenGL ES في مجموعة تطوير البرامج الأصلية لنظام التشغيل Android (NDK). توفّر الحزم android.opengl وjavax.microedition.khronos.opengles وظائف OpenGL ES.
surface (مصطلح عام)، Surface (عنصر واجهة برمجة التطبيقات)
يمثّل السطح وحدة ذاكرة يتم دمجها مع الشاشة. تحتوي المساحة على لوحة للرسم، وتوفر طرقًا مساعدة مختلفة لرسم الطبقات وتغيير حجم عنصر Surface. استخدِم فئة SurfaceView بدلاً من فئة Surface مباشرةً.
عرض السطح (مصطلح عام)، SurfaceView (عنصر واجهة برمجة التطبيقات)
عرض السطح هو عنصر View يلف Surface لرسمه، ويعرِض طُرقًا لتحديد حجمه وتنسيقه بشكل ديناميكي. توفّر طريقة العرض على سطح الشاشة طريقة للرسم بشكل مستقل عن سلسلة مهام واجهة المستخدم للعمليات التي تستهلك موارد كثيرة، مثل الألعاب أو معاينات الكاميرا، ولكنّها تستخدِم ذاكرة إضافية نتيجةً لذلك. تتوافق "عرض السطح" مع كل من الرسم على سطح اللوحة ورسومات OpenGL ES. الفئة الأساسية لكائن SurfaceView هي SurfaceView.
theme
المظهر هو مجموعة من السمات، مثل حجم النص ولون الخلفية، يتم تجميعها معًا لتحديد إعدادات العرض التلقائية المختلفة. يقدّم Android بعض المظاهر العادية، والمدرَجة في R.style والمسبوقة بالرمز Theme_.
عرض (مصطلح عام)، View (عنصر واجهة برمجة التطبيقات)
يرسم العرض منطقة مستطيلة على الشاشة ويعالج النقرات وضغطات المفاتيح وأحداث التفاعل الأخرى. فئة View هي الفئة الأساسية لمعظم مكوّنات التنسيق في النشاط أو شاشة الحوار، مثل مربّعات النص والنوافذ. يتلقّى عنصر View طلبات من العنصر الرئيسي (راجِع ViewGroup) لرسم نفسه، ويُعلم العنصر الرئيسي بالحجم والموقع المفضّلَين، وقد لا يراعي العنصر الرئيسي ذلك. لمزيد من المعلومات، يُرجى الاطّلاع على View.
مجموعة الاطِّلاع (مصطلح عام)، ViewGroup (عنصر واجهة برمجة التطبيقات)
تجمِّع مجموعة العروض مجموعة من العروض الفرعية. تتحمّل مجموعة المشاهد مسؤولية تحديد مواضع المشاهد الفرعية وحجمها، بالإضافة إلى استدعاء كل منها لرسم نفسها عند الاقتضاء. تكون بعض مجموعات العرض غير مرئية ومخصّصة للتنسيق فقط، في حين أنّ مجموعات أخرى تحتوي على واجهة مستخدم أساسية، مثل مربّع قائمة لفائف. تقع مجموعات العرض في حزمة widget ولكنها تمدّد فئة ViewGroup.
عرض التسلسل الهرمي
إنّ التسلسل الهرمي لطريقة العرض هو ترتيب لعناصر طريقة العرض ومجموعات طرق العرض التي تحدِّد واجهة المستخدم لكل مكوّن من مكوّنات التطبيق. ويتألّف التسلسل الهرمي من مجموعات طرق العرض التي تحتوي على طريقة عرض فرعية واحدة أو أكثر أو مجموعات طرق عرض. يمكنك الحصول على تمثيل مرئي لسلسلة العرض من أجل تصحيح الأخطاء وتحسين الأداء باستخدام عارِض التسلسل الهرمي الذي يتم توفيره مع حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
Vulkan
Vulkan هي واجهة برمجة تطبيقات خفيفة تعمل على جميع المنصات لتوفير رسومات ثلاثية الأبعاد عالية الأداء.
أداة مصغّرة
التطبيق المصغّر هو أحد مجموعات الفئات الفرعية للعرض التي تم تنفيذها بالكامل والتي تعرِض عناصر النموذج ومكونات واجهة المستخدم الأخرى، مثل مربّع نص أو قائمة منبثقة. وبما أنّ التطبيق المصغّر مُنفَّذ بالكامل، فهو يتعامل مع القياس والرسم بنفسه والاستجابة لأحداث الشاشة. التطبيقات المصغّرة متوفّرة في الحزمة android.widget.
window (مصطلح عام)، Window (عنصر واجهة برمجة التطبيقات)
في تطبيق Android، النافذة هي عنصر مشتق من الفئة المجردة 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.

عملية التواصل مع 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.