الرسومات

رمز Android Graphics HAL

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

canvas (مصطلح عام)، Canvas (عنصر واجهة برمجة التطبيقات)
اللوحة هي سطح رسم يعالج تركيب الأجزاء الفعلية على سطح صورة نقطية أو كائن Surface. تحتوي فئة Canvas على methods لرسم الكمبيوتر العادي للصور المخصّصة للشاشة والخطوط والدائرات والمستطيلات والنصوص وما إلى ذلك، وهي مرتبطة بصور مخصّصة للشاشة أو سطح. اللوحة هي الطريقة الأسهل والأبسط لرسم الأجسام ثنائية الأبعاد على الشاشة. الصف الأساسي هو Canvas.
قابل للرسم
العنصر القابل للرسم هو مورد مرئي مجمّع يمكن استخدامه كخلفية أو عنوان أو جزء آخر من الشاشة. يتم عادةً تحميل عنصر قابل للرسم في عنصر واجهة مستخدم آخر، مثل صورة خلفية. لا يمكن للعنصر القابل للرسم تلقّي أحداث، ولكنه يحدّد خصائص أخرى مختلفة، مثل الحالة والجدولة، لتفعيل الفئات الفرعية، مثل عناصر الصور المتحركة أو مكتبات الصور. يتم تحميل العديد من العناصر القابلة للرسم من ملفات الموارد القابلة للرسم — ملفات XML أو ملفات صور نقطية تصف الصورة. يتم تجميع الموارد القابلة للرسم في فئات فرعية من android.graphics.drawable. لمزيد من المعلومات عن العناصر القابلة للرسم والموارد الأخرى، يُرجى الاطّلاع على نظرة عامة على موارد التطبيق.
مورد التصميم
مورد التنسيق هو ملف XML يصف تنسيق شاشة النشاط. لمزيد من المعلومات، يُرجى الاطّلاع على مورد التنسيق.
nine-patch (9-patch, NinePatch)
الصورة المربّعة التسعة هي مورد رسومات نقطية قابل للتغيير يمكن استخدامه للخلفيات أو الصور الأخرى على الجهاز. لمزيد من المعلومات، يُرجى الاطّلاع على Nine-patch.
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.
مظهر
المظهر هو مجموعة من السمات، مثل حجم النص ولون الخلفية، يتم تجميعها معًا لتحديد إعدادات العرض التلقائية المختلفة. يقدّم Android بعض المظاهر العادية، والمدرَجة في R.style والمسبوقة بالرمز Theme_.
عرض (مصطلح عام)، View (عنصر واجهة برمجة التطبيقات)
يرسم العرض منطقة مستطيلة على الشاشة ويعالج النقرات وضغطات المفاتيح وأحداث التفاعل الأخرى. فئة View هي الفئة الأساسية لمعظم مكوّنات التنسيق في النشاط أو شاشة الحوار، مثل مربّعات النص والنوافذ. يتلقّى عنصر View طلبات من العنصر الرئيسي (راجِع ViewGroup) لرسم نفسه، ويُعلم العنصر الرئيسي بالحجم والموقع المفضّلَين، وقد لا يراعي العنصر الرئيسي ذلك. لمزيد من المعلومات، يُرجى الاطّلاع على View.
مجموعة الاطّلاع (مصطلح عام)، ViewGroup (عنصر واجهة برمجة التطبيقات)
تجمِّع مجموعة العروض مجموعة من العروض الفرعية. تتحمّل مجموعة المشاهد مسؤولية تحديد مواضع المشاهد الفرعية وحجمها، بالإضافة إلى استدعاء كل منها لرسم نفسها عند الاقتضاء. تكون بعض مجموعات العرض غير مرئية ومخصّصة للتنسيق فقط، في حين أنّ مجموعات أخرى تتضمّن واجهة مستخدم أساسية، مثل مربّع قائمة لفائف. تقع مجموعات العرض في حزمة android.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 و"أداة إنشاء الصور" (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:

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