الرسومات

رمز Android Graphics HAL

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

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

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

مكوّنات رسومات Android

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

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

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

الشكل 1: طريقة عرض الأسطح

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

منتِجو تدفق الصور

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

مستهلكو تدفق الصور

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

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

Hardware Composer

طبقة تجريد الأجهزة للنظام الفرعي للعرض. يمكن أن تفوّض 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 على المنطق الذي يربط بين منتِجي تدفق الصور ومستهلكي تدفق الصور. من الأمثلة على منتِجي الصور معاينات الكاميرا التي تنشئها طبقة تجريد الأجهزة للكاميرا أو ألعاب OpenGL ES. من الأمثلة على مستهلكي الصور SurfaceFlinger أو تطبيق آخر يعرض تدفق OpenGL ES، مثل تطبيق الكاميرا الذي يعرض عدسة الكاميرا.

‫BufferQueue هي بنية بيانات تجمع بين مجموعة المخزن المؤقت وقائمة الانتظار، وتستخدم الاتصال بين العمليات (IPC) في Binder لنقل المخازن المؤقتة بين العمليات. واجهة المنتج، أو ما ترسله إلى شخص يريد إنشاء مخازن مؤقتة للرسومات، هي IGraphicBufferProducer (جزء من SurfaceTexture). غالبًا ما تُستخدم BufferQueue للعرض على Surface والاستهلاك باستخدام GL Consumer، بالإضافة إلى مهام أخرى.

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

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

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

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