الرسومات

رمز Android Graphics HAL

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

قماش (مصطلح عام)، Canvas (عنصر واجهة برمجة التطبيقات)
اللوحة القماشية عبارة عن سطح رسم يعالج تركيب البتات الفعلية مقابل صورة نقطية أو كائن Surface . يحتوي Canvas على أساليب لرسم الكمبيوتر القياسي للصور النقطية والخطوط والدوائر والمستطيلات والنص وما إلى ذلك، وهو مرتبط بصورة نقطية أو سطحية. اللوحة القماشية هي أبسط وأسهل طريقة لرسم كائنات ثنائية الأبعاد على الشاشة. الفئة الأساسية هي Canvas .
قابل للرسم
الرسم هو مورد مرئي مجمع يمكن استخدامه كخلفية أو عنوان أو جزء آخر من الشاشة. عادةً ما يتم تحميل الرسوميات إلى عنصر واجهة مستخدم آخر، على سبيل المثال كصورة خلفية. لا يمكن للرسوميات استقبال الأحداث، ولكنها تقوم بتعيين خصائص أخرى متنوعة مثل الحالة والجدولة، لتمكين الفئات الفرعية مثل كائنات الرسوم المتحركة أو مكتبات الصور. يتم تحميل العديد من الكائنات القابلة للرسم من ملفات الموارد القابلة للرسم — ملفات XML أو ملفات الصورة النقطية التي تصف الصورة. يتم تجميع الموارد القابلة للرسم في فئات فرعية من android.graphics.drawable . لمزيد من المعلومات حول الرسوميات والموارد الأخرى، راجع الموارد .
مورد التخطيط
مورد التخطيط هو ملف XML يصف تخطيط شاشة النشاط. لمزيد من المعلومات، راجع موارد التخطيط .
تسع رقعة (9 رقعة، تسع رقعة)
التصحيح التسعة عبارة عن مورد صور نقطية يمكن تغيير حجمه ويمكن استخدامه للخلفيات أو الصور الأخرى على الجهاز. لمزيد من المعلومات، راجع تسعة التصحيح .
برنامج 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 (عنصر واجهة برمجة التطبيقات)
تقوم مجموعة العرض بتجميع مجموعة من طرق العرض التابعة. تكون مجموعة العرض مسؤولة عن تحديد مكان وضع مشاهدات الأطفال ومدى حجمها، بالإضافة إلى دعوة كل منهم لرسم نفسه عندما يكون ذلك مناسبًا. بعض مجموعات العرض تكون غير مرئية ومخصصة للتخطيط فقط، بينما تحتوي مجموعات أخرى على واجهة مستخدم جوهرية، مثل مربع قائمة التمرير. توجد مجموعات العرض في حزمة widget ، ولكنها تعمل على توسيع فئة ViewGroup .
عرض التسلسل الهرمي
التسلسل الهرمي للعرض هو ترتيب للعرض وعرض كائنات المجموعة التي تحدد واجهة المستخدم لكل مكون من مكونات التطبيق. يتكون التسلسل الهرمي من مجموعات عرض تحتوي على طريقة عرض فرعية واحدة أو أكثر أو مجموعات عرض. يمكنك الحصول على تمثيل مرئي للتسلسل الهرمي للعرض لتصحيح الأخطاء وتحسينها باستخدام Hierarchy Viewer المتوفر مع Android SDK.
فولكان
Vulkan عبارة عن واجهة برمجة تطبيقات منخفضة التكلفة ومتعددة المنصات للرسومات ثلاثية الأبعاد عالية الأداء.
القطعة
عنصر واجهة المستخدم هو واحد من مجموعة فئات فرعية للعرض تم تنفيذها بالكامل والتي تعرض عناصر النموذج ومكونات واجهة المستخدم الأخرى، مثل مربع نص أو قائمة منبثقة. نظرًا لأنه تم تنفيذ عنصر واجهة المستخدم بالكامل، فإنه يتعامل مع القياس والرسم نفسه والاستجابة لأحداث الشاشة. الأدوات موجودة في حزمة android.widget .
نافذة (مصطلح عام)، Window (عنصر واجهة برمجة التطبيقات)
في تطبيق Android، النافذة هي كائن مشتق من فئة Window Abstract التي تحدد عناصر النافذة العامة، مثل الشكل والمظهر ونص شريط العنوان وموقع القوائم ومحتواها. تستخدم مربعات الحوار والأنشطة تطبيقًا لفئة Window لعرض كائن Window . لا تحتاج إلى تنفيذ فئة Window أو استخدام windows في تطبيقك.

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

مكونات رسومات أندرويد

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

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

مكونات تقديم الصورة

الشكل 1. كيف يتم تقديم الأسطح.

المكونات الرئيسية موضحة أدناه:

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

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

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

المستهلك الأكثر شيوعًا لتدفقات الصور هو SurfaceFlinger، وهي خدمة النظام التي تستهلك الأسطح المرئية حاليًا وتقوم بتركيبها على الشاشة باستخدام المعلومات المقدمة من Window Manager. SurfaceFlinger هي الخدمة الوحيدة التي يمكنها تعديل محتوى الشاشة. يستخدم SurfaceFlinger برنامج OpenGL وHardware Composer لتكوين مجموعة من الأسطح.

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

مؤلف الأجهزة

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

يقوم Hardware Composer HAL بتنفيذ النصف الآخر من العمل وهو النقطة المركزية لجميع عمليات عرض رسومات Android. يجب أن يدعم "مكونات الأجهزة" الأحداث، أحدها هو VSYNC (وآخر هو hotplug لدعم التوصيل والتشغيل HDMI).

جرالوك

يلزم تخصيص ذاكرة الرسومات (Gralloc) لتخصيص الذاكرة المطلوبة من قبل منتجي الصور. لمزيد من التفاصيل، راجع جرالوك هال .

تدفق البيانات

راجع الرسم البياني التالي للحصول على وصف لمسار رسومات Android:

تدفق البيانات الرسومية

الشكل 2. تدفق البيانات الرسومية عبر Android

الكائنات الموجودة على اليسار هي أجهزة عرض تنتج مخازن مؤقتة للرسومات، مثل الشاشة الرئيسية وشريط الحالة وواجهة مستخدم النظام. SurfaceFlinger هو الملحن وملحن الأجهزة هو الملحن.

BufferQueue

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

راجع الرسم البياني التالي لعملية الاتصال BufferQueue.

عملية الاتصال BufferQueue

الشكل 3. عملية الاتصال BufferQueue

يحتوي BufferQueue على المنطق الذي يربط منتجي دفق الصور ومستهلكي دفق الصور معًا. بعض الأمثلة على منتجي الصور هي معاينات الكاميرا التي تنتجها ألعاب الكاميرا HAL أو OpenGL ES. بعض الأمثلة على مستهلكي الصور هي SurfaceFlinger أو أي تطبيق آخر يعرض تدفق OpenGL ES، مثل تطبيق الكاميرا الذي يعرض عدسة الكاميرا.

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

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

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

وضع عدم الحظر - يمكن أن يعمل BufferQueue أيضًا في وضع عدم الحظر حيث يولد خطأ بدلاً من انتظار المخزن المؤقت في تلك الحالات. ولا يتم تجاهل أي مخزن مؤقت في هذا الوضع أيضًا. يعد هذا مفيدًا لتجنب حالات الجمود المحتملة في البرامج التطبيقية التي قد لا تفهم التبعيات المعقدة لإطار عمل الرسومات.

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

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

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