الرسومات

رمز طبقة تجريد الأجهزة لرسومات Android

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

لوحة العرض (مصطلح عام)، Canvas (عنصر في واجهة برمجة التطبيقات)
اللوحة هي سطح رسم يتعامل مع تركيب البتات الفعلية على صورة نقطية أو كائن Surface. يحتوي الصف Canvas على طرق للرسم العادي على الكمبيوتر للصور النقطية والخطوط والدوائر والمستطيلات والنصوص وما إلى ذلك، كما أنّه مرتبط بصورة نقطية أو سطح. اللوحة القماشية هي أبسط وأسهل طريقة لرسم كائنات ثنائية الأبعاد على الشاشة. الفئة الأساسية هي Canvas.
قابل للرسم
المورد القابل للرسم هو مورد مرئي مجمَّع يمكن استخدامه كخلفية أو عنوان أو جزء آخر من الشاشة. يتم عادةً تحميل عنصر قابل للرسم في عنصر آخر من عناصر واجهة المستخدم، مثلاً كصورة خلفية. لا يمكن أن يتلقّى العنصر القابل للرسم الأحداث، ولكنّه يحدّد خصائص أخرى متنوعة، مثل الحالة والجدولة، وذلك لتفعيل الفئات الفرعية، مثل عناصر الصور المتحركة أو مكتبات الصور. يتم تحميل العديد من عناصر الرسومات القابلة للرسم من ملفات موارد الرسومات القابلة للرسم، وهي ملفات XML أو ملفات صور نقطية تصف الصورة. يتم تجميع موارد قابلة للرسم في فئات فرعية من android.graphics.drawable. لمزيد من المعلومات حول العناصر القابلة للرسم والموارد الأخرى، يُرجى الاطّلاع على نظرة عامة على موارد التطبيق.
مورد التصميم
مورد التصميم هو ملف XML يصف تصميم شاشة النشاط. لمزيد من المعلومات، اطّلِع على مورد التنسيق.
Nine-patch (9-patch, NinePatch)
‫Nine-patch هي مصدر نقطي قابل لتغيير الحجم يمكن استخدامه للخلفيات أو الصور الأخرى على الجهاز. لمزيد من المعلومات، يمكنك الاطّلاع على Nine-patch.
OpenGL ES
‫OpenGL ES هي واجهة برمجة تطبيقات متوافقة مع عدة أنظمة أساسية لعرض الرسومات الثنائية والثلاثية الأبعاد. يوفّر نظام التشغيل Android مكتبات OpenGL ES لعرض الرسومات الثلاثية الأبعاد باستخدام تسريع الأجهزة. بالنسبة إلى العرض الثنائي الأبعاد، فإنّ لوحة الرسم هي الخيار الأبسط. تتوفّر OpenGL ES في حزمة تطوير البرامج الأصلية لنظام Android (NDK). تعرض الحزمتان android.opengl وjavax.microedition.khronos.opengles وظائف OpenGL ES.
مساحة العرض (مصطلح عام)، Surface (عنصر واجهة برمجة التطبيقات)
يمثّل السطح مجموعة من وحدات الذاكرة التي يتم دمجها معًا على الشاشة. تحتوي مساحة العرض على لوحة رسم، وتوفّر طرقًا مساعدة متنوعة لرسم الطبقات وتغيير حجم العنصر Surface. استخدِم الفئة SurfaceView بدلاً من الفئة Surface مباشرةً.
طريقة عرض المساحة (مصطلح عام)، SurfaceView (عنصر واجهة برمجة التطبيقات)
SurfaceView هو عنصر View يغلّف عنصر Surface للرسم، ويتيح طرقًا لتحديد حجمه وتنسيقه بشكل ديناميكي. توفّر طريقة الرسم بشكل مستقل عن سلسلة محادثات واجهة المستخدم للعمليات التي تتطلّب موارد مكثّفة، مثل الألعاب أو معاينات الكاميرا، ولكنها تستخدم ذاكرة إضافية نتيجة لذلك. تتيح طريقة العرض السطحية استخدام كل من لوحة الرسم ورسومات OpenGL ES. الفئة الأساسية لكائن SurfaceView هي SurfaceView.
مظهر
المظهر هو مجموعة من الخصائص، مثل حجم النص ولون الخلفية، يتم تجميعها معًا لتحديد إعدادات العرض التلقائية المختلفة. يوفّر Android بعض السمات العادية، والمدرَجة في R.style والمسبوقة بـ Theme_.
عرض (مصطلح عام)، View (عنصر واجهة برمجة التطبيقات)
تعرض طريقة العرض مساحة مستطيلة على الشاشة وتتعامل مع أحداث النقرات وضغطات المفاتيح وغيرها من أحداث التفاعل. فئة View هي الفئة الأساسية لمعظم مكوّنات التنسيق الخاصة بشاشة نشاط أو مربّع حوار، مثل مربّعات النصوص والنوافذ. يتلقّى العنصر View طلبات من العنصر الرئيسي (راجِع ViewGroup) لعرض نفسه، ويُعلم العنصر الرئيسي بالحجم والموقع المفضّلين، وقد لا يلتزم العنصر الرئيسي بهذه المعلومات. لمزيد من المعلومات، يُرجى الاطّلاع على View.
مجموعة العرض (مصطلح عام)، ViewGroup (عنصر واجهة برمجة التطبيقات)
تجمع مجموعة العرض مجموعة من طرق العرض الفرعية. تكون مجموعة العرض مسؤولة عن تحديد موضع عناصر العرض الفرعية وحجمها، بالإضافة إلى استدعاء كل عنصر لعرض نفسه عند الحاجة. بعض مجموعات العرض غير مرئية وهي مخصّصة للتصميم فقط، بينما يحتوي البعض الآخر على واجهة مستخدم مضمّنة، مثل مربّع قائمة قابل للتمرير. تتوفّر طرق العرض الخاصة بالمجموعات في حزمة android.widget، ولكنها توسّع فئة ViewGroup.
عرض التدرّج الهرمي
هيكلية العرض هي ترتيب لعناصر العرض ومجموعات العرض التي تحدّد واجهة المستخدم لكل مكوّن من مكوّنات التطبيق. تتألف الهيكلية من مجموعات العرض التي تحتوي على عنصر عرض واحد أو أكثر أو مجموعات عرض. يمكنك الحصول على تمثيل مرئي لبنية العرض الهرمية لتصحيح الأخطاء وتحسين الأداء باستخدام أداة Hierarchy Viewer المضمّنة في حزمة تطوير البرامج (SDK) لنظام التشغيل Android.
Vulkan
Vulkan هي واجهة برمجة تطبيقات متوافقة مع عدة أنظمة أساسية تتطلّب موارد قليلة للرسومات الثلاثية الأبعاد عالية الأداء.
تطبيق مصغَّر
التطبيق المصغّر هو أحد مجموعة من الفئات الفرعية للعرض التي تم تنفيذها بالكامل، والتي تعرض عناصر النموذج ومكوّنات أخرى في واجهة المستخدم، مثل مربّع نص أو قائمة منبثقة. بما أنّ إحدى الأدوات مدمجة بالكامل، فإنّها تتعامل مع القياس والرسم والاستجابة لأحداث الشاشة. تتوفّر التطبيقات المصغّرة في حزمة android.widget.
نافذة (مصطلح عام)، Window (عنصر في واجهة برمجة التطبيقات)
في تطبيق Android، النافذة هي عنصر مشتق من Window الفئة المجردة التي تحدد عناصر النافذة العامة، مثل الشكل والمظهر ونص شريط العنوان والموقع الجغرافي ومحتوى القوائم. تستخدم مربّعات الحوار والأنشطة عملية تنفيذ للفئة Window لعرض كائن Window. لست بحاجة إلى تنفيذ الفئة Window أو استخدام النوافذ في تطبيقك.

يرسم مطوّرو التطبيقات الصور على الشاشة بثلاث طرق: باستخدام Canvas أو OpenGL ES أو Vulkan.

مكوّنات الرسومات في Android

بغض النظر عن واجهة برمجة التطبيقات التي يستخدمها المطوّرون لعرض المحتوى، يتم عرض كل شيء على سطح. يمثّل Surface جانب المنتج في قائمة انتظار مؤقتة يستهلكها SurfaceFlinger غالبًا. يتم إنشاء كل نافذة على منصة Android باستخدام مساحة عرض. يتم دمج جميع المساحات المرئية المعروضة على الشاشة من خلال SurfaceFlinger.

يوضّح الرسم البياني التالي كيفية عمل المكوّنات الرئيسية معًا:

مكوّنات عرض الصور

الشكل 1. طريقة عرض مساحات العرض

يتم وصف المكوّنات الرئيسية في الأقسام التالية.

منتجو بث الصور

يمكن أن يكون منتج بث الصور أي شيء ينتج مخازن مؤقتة للرسومات بغرض الاستهلاك. وتشمل الأمثلة على ذلك OpenGL ES وCanvas 2D وبرامج فك ترميز الفيديو في mediaserver.

مستهلكو بث الصور

إنّ SurfaceFlinger هو أكثر مستهلكي بث الصور شيوعًا، وهو خدمة نظام تستهلك المساحات المرئية حاليًا وتدمجها على الشاشة باستخدام المعلومات التي يقدّمها Window Manager. ‫SurfaceFlinger هي الخدمة الوحيدة التي يمكنها تعديل محتوى الشاشة. يستخدم SurfaceFlinger OpenGL وHardware Composer (HWC) لإنشاء مجموعة من المساحات.

يمكن لتطبيقات OpenGL ES الأخرى أيضًا استخدام بث الصور، مثل تطبيق الكاميرا الذي يستخدم بث صور معاينة الكاميرا. يمكن أن تكون التطبيقات غير المتوافقة مع GL مستهلكة أيضًا، مثل فئة ImageReader.

Hardware Composer

طبقة تجريد الأجهزة لنظام العرض الفرعي يمكن لـ SurfaceFlinger تفويض بعض أعمال الدمج إلى HWC لتخفيف الحمل على OpenGL ووحدة معالجة الرسومات. تعمل SurfaceFlinger كعميل آخر من عملاء OpenGL ES. لذلك، عندما يدمج SurfaceFlinger بشكل نشط مخزنًا مؤقتًا واحدًا أو اثنين في مخزن ثالث، على سبيل المثال، يستخدم OpenGL ES. وهذا يجعل عملية التركيب أقل استهلاكًا للطاقة من أن تتولّى وحدة معالجة الرسومات إجراء جميع العمليات الحسابية.

يتولّى Hardware Composer HAL تنفيذ الجزء الآخر من العمل، وهو النقطة المركزية لجميع عمليات عرض الرسومات في Android. يجب أن يتيح HWC الأحداث، أحدها هو VSync (والآخر هو التوصيل السريع لتوفير إمكانية التوصيل والتشغيل عبر 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 هي بنية بيانات تجمع بين مجموعة من المخازن المؤقتة وقائمة انتظار، وتستخدم عملية الاتصال بين العمليات (IPC) في Binder لنقل المخازن المؤقتة بين العمليات. واجهة المنتج، أو ما يتم تمريره إلى شخص يريد إنشاء مخازن مؤقتة للرسومات، هي IGraphicBufferProducer (جزء من SurfaceTexture). يتم استخدام BufferQueue غالبًا لعرض المحتوى على Surface واستهلاكه باستخدام GL Consumer، بالإضافة إلى مهام أخرى.

يمكن أن تعمل BufferQueue بثلاثة أوضاع مختلفة:

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

لتنفيذ معظم هذه المهام، يعمل SurfaceFlinger كعميل آخر من عملاء OpenGL ES. لذا، عندما يدمج SurfaceFlinger بشكل نشط مخزنًا مؤقتًا واحدًا أو اثنين في مخزن ثالث، على سبيل المثال، يستخدم OpenGL ES.

يتولّى Hardware Composer HAL تنفيذ الجزء الآخر من العمل. تعمل طبقة HAL هذه كنقطة مركزية لجميع عمليات عرض الرسومات في Android.